Macros Plain TeX contêm \par como delimitador de parâmetro, mas não funcionam com \obeylines, por quê?

Macros Plain TeX contêm \par como delimitador de parâmetro, mas não funcionam com \obeylines, por quê?

Eu só queria formatar um .csvarquivo, então faço um teste (1), mostrado abaixo:

\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

mas não funciona, TeX reclama disso

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

então eu removo \obeylines, faço outro teste (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

Funciona bem. Quem pode me dizer onde está errado o teste (1)?

Responder1

\obeylinesem claro é

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

letOu seja , ativa os fins de linha e\par

Isso significa que você precisa delimitar sua macro por um ativo ^^Me não por um \partoken, o \partoken não está no fluxo que está sendo verificado, ele só é gerado se o token de fim de linha se expandir.

\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

Responder2

Se o arquivo brooks.csvcontém

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

então lê-lo linha por linha provavelmente é melhor. Isto requer e-TeX, mas também pode ser realizado em 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

insira a descrição da imagem aqui

informação relacionada