Este ejercicio pregunta cómo almacenar la expansión de \chapno
en el momento en que \write
se procesa, pero \the\count0
debe 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 \noexpand
equivalente al \let
truco? ¿Y por qué \noexpand
no se usa en la respuesta, solo para mostrar las posibilidades?
Respuesta1
\protected@write
Bá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 \noexpand
delante de los tokens que tiene control mientras escribe la macro, pero <token list>
en su ejemplo generalmente provendrá #1
de algún argumento de título de sección en el documento, pero desea suprimir las expansiones de todos los registros hasta \shipout
y el texto puede hacer referencia a cualquiera de ellos. por lo tanto, al convertirlo en \the
no expandible (no importa mucho a qué \let
lo use, 0
o \relax
cualquier otro token no expandible, entonces permanecerá como sí mismo en \edef
pero 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, \the
en cuyo caso suprimir toda \the
expansión podría ser demasiado. (Tenga en cuenta que LaTeX simplemente impide \thepage
que otros contadores se expandan en el punto de uso, no en el envío final).