如果您测试以下最小值,它不会产生错误。它实际上做了什么?
\the\everypar
\bye
为什么它没有像人们预期的那样产生错误?
答案1
\everypar
是一个令牌列表寄存器,因此其值由
\everypar={<tokens>}
其在 Plain TeX 中的默认值为空。
这是干什么用的?当 TeX 从垂直模式切换到水平模式时,其内容会被传送到 TeX 正在读取的标记列表中。当 TeX 在垂直模式下看到水平命令,例如要排版的字符 或\indent
或\noindent
。
此时水平命令被搁置一旁;在再次检查之前,TeX 会将\parskip
粘连添加到垂直列表中并进入水平模式;现在它会将 的内容视为\everypar
隐式\the\everypar
的,并重新检查强制切换到水平模式的水平命令。然而,由 以外的水平命令引起的水平模式切换\noindent
会导致 TeX 插入一个宽度为\parindent
前的内容\everypar
。
我们可以用它\everypar
在段落开始时自动执行一些工作,比如对段落进行编号。
LaTeX 大量利用了这种机制,因此在工作涉及列表时不建议使用它。一个例子是声明
\everypar{\@nodocument}
\begin{document}
在处理之前一直有效;\@nodocument
发出错误消息Missing \begin{document}
以警告用户在序言中发现了开始一个段落的文本。
由于所有 token 都已注册,因此其价值可以通过以下方式增加:
\everypar=\expandafter{\the\everypar<tokens>}
因为\the\everypar
将传递当前寄存器的内容。