Pregunta sobre el ejercicio 21.10 en The TeXbook

Pregunta sobre el ejercicio 21.10 en The TeXbook

Este ejercicio pregunta cómo almacenar la expansión de \chapnoen el momento en que \writese procesa, pero \the\count0debe expandirse en el momento de \shipout. Aquí hay un ejemplo completo:

\def\chapno{5}
\newwrite\cont \openout\cont=out.txt
\edef\next{\write\cont{\chapno,\noexpand\the\count0}}\next
\def\chapno{6}
\count0=100
\bye

Se utiliza una técnica curiosa en la respuesta:

{\let\the=0\edef\next{\write\cont{<token list>}}\next}

¿Usar es \noexpandequivalente al \lettruco? ¿Y por qué \noexpandno se usa en la respuesta, solo para mostrar las posibilidades?

Respuesta1

\protected@writeBásicamente, así es como funciona el látex :

\long\def \protected@write#1#2#3{%
      \begingroup
       \let\thepage\relax
       #2%
       \let\protect\@unexpandable@protect
       \edef\reserved@a{\write#1{#3}}%
       \reserved@a
      \endgroup
      \if@nobreak\ifvmode\nobreak\fi\fi
}

Normalmente, en una construcción de este tipo, puede usar \noexpanddelante de los tokens que tiene control mientras escribe la macro, pero <token list>en su ejemplo generalmente provendrá #1de algún argumento de título de sección en el documento, pero desea suprimir las expansiones de todos los registros hasta \shipouty el texto puede hacer referencia a cualquiera de ellos. por lo tanto, al convertirlo en \theno expandible (no importa mucho a qué \let lo use, 0o \relaxcualquier otro token no expandible, entonces permanecerá como sí mismo en \edefpero tendrá su definición expandible normal en \write.

Tenga en cuenta que el ejercicio tiene el caso sencillo en el que el número de capítulo es una macro ampliable. En la mayoría de los formatos, los capítulos se numerarían automáticamente, por lo que se utilizaría un registro de recuento y, en última instancia, también se accedería a ellos, \theen cuyo caso suprimir toda \theexpansión podría ser demasiado. (Tenga en cuenta que LaTeX simplemente impide \thepageque otros contadores se expandan en el punto de uso, no en el envío final).

información relacionada