\the\everypar 起什么作用?

\the\everypar 起什么作用?

如果您测试以下最小值,它不会产生错误。它实际上做了什么?

\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将传递当前寄存器的内容。

相关内容