プレーン TeX マクロにはパラメータ区切り文字として \par が含まれていますが、\obeylines では機能しません。なぜでしょうか?

プレーン TeX マクロにはパラメータ区切り文字として \par が含まれていますが、\obeylines では機能しません。なぜでしょうか?

ファイルをフォーマットしたかっただけなので.csv、以下に示すようなテスト (1) を実行します。

\global\let\xpar=\par
\def\format#1,#2,#3\par{$#1\times #2=#3$\xpar}
\begingroup
\everypar={\format}\obeylines%
11,2,22
13,9,117
a,b,c
\endgroup
\end

しかし、うまく動作しないので、TeXは次のように警告します。

! File ended while scanning use of \format.
<inserted text> 
            \par 

そこで を削除して\obeylines別のテスト(2)を実行します。

\global\let\xpar=\par
\def\format#1,#2,#3\par{$#1\times #2=#3$\xpar}
\begingroup
\format 11,2,22

\format 13,9,117

\format a,b,c

\endgroup
\end

正常に動作します。テスト(1)のどこが間違っているのか教えていただけますか?

答え1

\obeylines平野では

{\catcode`\^^M=\active % these lines must end with %
  \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
  \global\let^^M\par}

つまり、線の端をアクティブにしletて、\par

つまり、マクロをトークンで^^Mはなくアクティブで区切る必要があります\par\parトークンはスキャンされるストリーム内に存在せず、行末トークンが展開される場合にのみ生成されます。

\begingroup
\everypar={\format}\obeylines%
\def\format#1,#2,#3^^M{$#1\times #2=#3$\par}%
11,2,22
13,9,117
a,b,c
\endgroup
\end

答え2

ファイルbrooks.csv

11,2,22
13,9,117
a,b,c

行ごとに読む方がおそらく良いでしょう。これには e-TeX が必要ですが、Knuth TeX でも実現できます。

\def\format#1,#2,#3\format{$#1\times#2=#3$\par}
\newread\brooksread

\hsize=.5\hsize % just for the example

\noindent X\hrulefill X\par

\openin\brooksread=brooks.csv
\begingroup\endlinechar=-1
\loop\unless\ifeof\brooksread
  \read\brooksread to \test \show\test
  \unless\ifx\test\empty
    \expandafter\format\test\format
  \fi
\repeat
\endgroup

\noindent X\hrulefill X\par

\bye

ここに画像の説明を入力してください

関連情報