我正在尝试弄清楚 TeX 的扩展规则。请考虑以下纯 TeX 手稿:
\toks1{hello}%
\toks10{world}%
\def\mac{0}%
\the\toks1\noexpand\mac%
\bye
当使用 pdftex 处理此手稿时,得到以下 pdf 结果:
日志文件包含以下警告:
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
大概就是你的朋友:例子很简短,痕迹很清晰。