TeX 标记器和引擎的操作是如何交叉的?

TeX 标记器和引擎的操作是如何交叉的?

第 38 页Knuth 的TeXbook(1996),TeX 系统被分解为两个部分:一个是“嘴”,它“咀嚼”手稿.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,完成分配。

相关内容