第 38 页Knuth 的TeXbook(1996),TeX 系统被分解为两个部分:一个是“嘴”,它“咀嚼”手稿.tex
并将其转换为标记;另一个是“胃”,它根据从“嘴”接收到的标记列表进行实际处理。
以下是相关摘录。
从这个描述中我不清楚的是这两个部分是如何相互同步的。
是否只有当“嘴巴”将整个手稿转换为标记后,“胃”才会被激活,还是“嘴巴”和“胃”的激活是交替的?
如果是后者,它们是如何交错的?“嘴巴”是否会在每个标记之后停下来,等待胃处理标记,然后再处理手稿的其余部分,或者“嘴巴”是否会以更大的块进行操作,比如一次读取和标记整行手稿?
答案1
如果整行都提前标记化,则无法在行中途更改标记化
在
\@zzz \makeatletter \@zzz
第一个“单词”被标记为四个标记\@
z
z
z
然后在原因扩展之后,第二个单词\makeatletter
的 catcode 的分配(胃部手术)@
被标记为单个标记\@zzz
基本上,每个胃操作都需要一些输入,然后 TeX 扩展标记,直到该操作有足够的输入,然后它开始处理剩余的输入。
所以如果你有
\def\zz{12}\def\zzz{ \zzzz}\def\zzzz{hello}
\count0=\zz\zzz
\count0
然后当在stomach中开始赋值时, tex会扩展标记,直到它有一个有效的计数,所以首先\zz
扩展到12,这不是一个完整的数字,然后\zzz
扩展到,\zzzz
所以计数在空格处完成,所以\zzzz
不扩展,TeX表现得好像输入已经
\count0=12 \zzzz
然后,分配处理将继续进行,扩展\zzzz
(除非处理顺序已使用 改变\afterassignment
)。
所以这里\count0=\zz\zzz
被处理为开始分配,扩展\zz
,扩展\zzz
,完成分配,扩展\zzzz
。
相反,如果空间不存在,而是在\zzzz
:
\def\zz{12}\def\zzz{\zzzz}\def\zzzz{ hello}
\count0=\zz\zzz
那么在扩展之后,\zzz
分配仍然不会完成,因此\zzzz
在这种情况下会在分配发生之前进行扩展,并且 TeX 会表现得好像输入是
\count0=12 hello
操作顺序为
\count0=\zz\zzz
被处理为分配的开始,扩展\zz
扩展\zzz
扩展\zzzz
,完成分配。