Einfache TeX-Makros enthalten \par als Parametertrennzeichen, funktionieren aber nicht mit \obeylines. Warum?

Einfache TeX-Makros enthalten \par als Parametertrennzeichen, funktionieren aber nicht mit \obeylines. Warum?

Ich wollte nur eine Datei formatieren .csvund 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 \obeylinesund 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

\obeylinesin 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 letund\par

^^MDies bedeutet, dass Sie Ihr Makro durch ein aktives Element und nicht durch ein Token begrenzen müssen \par. Das \parToken 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.csventhä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

Bildbeschreibung hier eingeben

verwandte Informationen