\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
在使用时抑制让其他计数器扩展,而不是最终发货时)。