Este exercício pergunta como armazenar a expansão \chapno
no momento em que \write
é processado, mas \the\count0
deve ser expandido no momento em que \shipout
. Aqui está um exemplo 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
Uma técnica curiosa é usada na resposta:
{\let\the=0\edef\next{\write\cont{<token list>}}\next}
Usar é \noexpand
equivalente ao \let
-trick? E por que \noexpand
não é usado na resposta – apenas para mostrar as possibilidades?
Responder1
É essencialmente assim que o látex \protected@write
também funciona:
\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, em tal construção, você pode usar \noexpand
na frente dos tokens que você tem controle ao escrever a macro, mas no <token list>
seu exemplo geralmente virá #1
de algum argumento de título de seção no documento, mas você deseja suprimir as expansões de todos os registros até \shipout
e o texto pode referir-se a qualquer um deles. tornando- \the
o não expansível (não importa muito o que você \let
faça, 0
ou \relax
qualquer outro token não expansível, ele permanecerá como ele mesmo, \edef
mas terá sua definição expansível normal no arquivo \write
.
Observe que o exercício tem o caso fácil em que o número do capítulo é uma macro expansível. Na maioria dos formatos, os capítulos seriam numerados automaticamente usando um registro de contagem e talvez também acessados em última análise, \the
caso em que suprimir toda \the
a expansão poderia ser demais. (Observe que o LaTeX apenas suprime \thepage
a expansão de outros contadores no ponto de uso, não no envio final).