Pergunta sobre o exercício 21.10 no The TeXbook

Pergunta sobre o exercício 21.10 no The TeXbook

Este exercício pergunta como armazenar a expansão \chapnono momento em que \writeé processado, mas \the\count0deve 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 é \noexpandequivalente ao \let-trick? E por que \noexpandnão é usado na resposta – apenas para mostrar as possibilidades?

Responder1

É essencialmente assim que o látex \protected@writetambé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 \noexpandna frente dos tokens que você tem controle ao escrever a macro, mas no <token list>seu exemplo geralmente virá #1de algum argumento de título de seção no documento, mas você deseja suprimir as expansões de todos os registros até \shipoute o texto pode referir-se a qualquer um deles. tornando- \theo não expansível (não importa muito o que você \let faça, 0ou \relaxqualquer outro token não expansível, ele permanecerá como ele mesmo, \edefmas 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, \thecaso em que suprimir toda \thea expansão poderia ser demais. (Observe que o LaTeX apenas suprime \thepagea expansão de outros contadores no ponto de uso, não no envio final).

informação relacionada