关于 TeXbook 练习 21.10 的问题

关于 TeXbook 练习 21.10 的问题

\chapno这个练习问的是,当\write处理时,如何存储 的扩展,但\the\count0必须在 时进行扩展\shipout。这是一个完整的例子:

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

答案中使用了一种有趣的技巧:

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

使用是否\noexpand等同于\let-trick?为什么\noexpand在答案中不使用 - 只是为了显示可能性?

答案1

乳胶的\protected@write工作原理基本上如下:

\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
}

通常在这样的构造中,您可以\noexpand在编写宏时在您可以控制的标记前面使用,但是<token list>您的示例中通常来自#1文档中的某些节标题参数,但您想要抑制所有寄存器的扩展,直到\shipout并且文本可能引用其中任何一个。因此,制作\the不可扩展的(无论您\let 将它变成什么,0或者\relax或任何其他不可扩展的标记,它都会保持原样,\edef但在中有其正常的可扩展定义\write

请注意,练习中有一个简单的情况,即章节编号是一个可扩展的宏。在大多数格式中,章节会自动编号,因此使用计数寄存器,并且最终可能通过访问,\the在这种情况下抑制所有\the扩展可能太多了。(请注意,LaTeX 只是\thepage在使用时抑制让其他计数器扩展,而不是最终发货时)。

相关内容