
Ich wollte nur eine Datei formatieren .csv
und habe deshalb einen Test (1) durchgeführt, der wie folgt aussieht:
\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
aber es funktioniert nicht, TeX beschwert sich, dass
! File ended while scanning use of \format.
<inserted text>
\par
also entferne ich \obeylines
und mache einen weiteren Test (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
es funktioniert gut. Wer kann mir sagen, wo der Fehler bei Test (1) liegt?
Antwort1
\obeylines
in der Ebene ist
{\catcode`\^^M=\active % these lines must end with %
\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
\global\let^^M\par}
Das heißt, es macht die Enden der Linie aktiv let
und\par
^^M
Dies bedeutet, dass Sie Ihr Makro durch ein aktives Element und nicht durch ein Token begrenzen müssen \par
. Das \par
Token befindet sich nicht im gescannten Stream. Es wird nur generiert, wenn das Zeilenende-Token erweitert wird.
\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
Antwort2
Wenn die Datei brooks.csv
enthält
11,2,22
13,9,117
a,b,c
dann ist es wahrscheinlich besser, es Zeile für Zeile zu lesen. Dies erfordert e-TeX, könnte aber auch in Knuth TeX realisiert werden.
\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