作者: Hiroshima Tsutomu
日時: 2002/5/16(14:53)
いつものマシンではないので
新スレッドになってしまいました.

ようやく課題2がひとつできました.

Yさ さんの投稿されたデータのフォーマットの
index.txt という名のファイルを読み込んで
索引のページ(.dvi)をつくります.

データフォーマットについてすこし注意を...
1行が,

[数字][空白一つ][見出し][改行]

のフォーマットしか想定していません.
[数字] の前に空白をおいたり,区切りにタブを使ったり,
[見出し]を空欄にしたりした場合の動作は未確認です.

見出しには空白文字を含めても構わないですが,
空白文字だけで構成することはできないかもしれません.

こまかな問題点としては,
ページ番号を抑制しないとエラーになることと,
Underfull の Warning がでることです.

そしてさらに最大の欠陥は
見出しに TeX のマクロ名と一致する文字列(def, relax, など)を使ってはいけ
ない
ということです.
見出しは日本語だけにしておいてくださいね.

それでははじまりはじまり...

\newread\indexfile
\openin\indexfile=index.txt
\endlinechar=-1
\nopagenumbers
\newtoks\titles
\newtoks\temp
\titles={}
\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}
\def\push#1#2{
  \ifundefined{#1}
     \expandafter\edef\csname#1\endcsname{#2}
     \titles=\expandafter{\the\titles#1\relax}
  \else
     \temp=\expandafter\expandafter\expandafter{\csname#1\endcsname}
     \expandafter\edef\csname#1\endcsname{\the\temp,#2}
  \fi
}
\def\doiterate#1 #2\done{
  \push{#2}{#1}
}
\def\whileiterate{
  \read\indexfile to \line
  \ifx\line\empty
    \let\next=\relax
  \else
    \expandafter\doiterate\line \done
    \let\next=\whileiterate
  \fi\next
}
\whileiterate
\closein\indexfile
\noindent
\def\titlebox#1{\hbox to .5\hsize{#1\hss}}
\def\showone#1\relax{
  \ifx#1\relax\relax
    \let\next=\relax
  \else
    \message{#1 ... \csname#1\endcsname}
    #1 \dotfill\ \csname#1\endcsname\break
    \let\next=\showone
  \fi\next
}
\expandafter\showone\the\titles\relax
\bye

おしまい
=====================
廣島 勉
tsutomu@...