TeX 的扩展规则:以标记列表寄存器为例

TeX 的扩展规则:以标记列表寄存器为例

我正在尝试弄清楚 TeX 的扩展规则。请考虑以下纯 TeX 手稿:

\toks1{hello}%
\toks10{world}%
\def\mac{0}%
\the\toks1\noexpand\mac%
\bye

当使用 pdftex 处理此手稿时,得到以下 pdf 结果:

Hello, world!

日志文件包含以下警告:

Underfull \hbox (badness 10000) has occurred while \output is active
[]\tenrm world

\hbox(8.5+0.0)x469.75499
.\vbox(8.5+0.0)x0.0
.\tenrm w
.\kern-0.27779
.\tenrm o
.\tenrm r
.etc.

[1{/usr/local/texlive/2017/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] )<./c
mr10.pfb>

0如果我将稿件中的 替换为2,稿件将变成

\toks1{hello}%
\toks12{world}%
\def\mac{2}%
\the\toks1\noexpand\mac%
\bye

pdf 中只有一行:

你好2

日志文件中没有警告。

有人能解释一下为什么 pdf 文档看起来是这个样子,警告是什么意思,以及为什么会报告这个警告吗?另外,请告诉我 TeX 处理我的手稿的步骤。谢谢。

答案1

我将跳过这三项作业,直接进入

\the\toks1\noexpand\mac

\the语插入寄存器的内容:这里是\toks。在 之后\toks我们需要一个数字,因此 TeX 会去寻找一个数字:它找到一个文字,1然后是\noexpand,它会暂时变成\mac\relax从而终止对数字的搜索。 \toks1包含hello,因此会插入 (并开始一个段落),然后 TeX 重新读取 ,\mac现在“恢复正常”:一个扩展为 的宏0。所以您看到的段落是hello0。(当然,正如人们所期望的那样,段落开头会有段落缩进。)

那么为什么会world插入呢?这是因为您选择了\toks10:更改数字,它就会消失。在纯 TeX 中,\headline\toks10会作为页面完成的一部分插入:它与您的特定输入无关(除了您设置它!)。当然,这就是为什么我们几乎总是使用寄存器分配系统的原因。

这里,\tracingall大概就是你的朋友:例子很简短,痕迹很清晰。

相关内容