这是 TeX 的第 309 节:
\halign
输入例程还必须与和 的处理进行交互\valign
,因为在某些地方出现制表符 和\cr
应该会触发扫描仪中特殊〈vj〉模板文本的开始。这个魔法是由一个align_state
变量实现的,当扫描到 ' ' 时,该变量增加 1 ,当扫描到{
' ' 时,该变量减少 1。在 〈uj〉模板期间 为非零,之后将其设置为零;当制表符 或出现在= 0时, 〈vj〉模板开始。}
align_state
\cr
align_state
〈全局变量 13〉+≡
align_state: integer; {group level with respect to current alignment}
事实上,在第 342 条中我们看到
if cur cmd ≤ car ret then
if cur cmd ≥ tab mark then
if align state = 0 then 〈Insert the〈vj〉template and goto restart 789〉
而其他部分align_state
则按规定递增和递减。
但是 的一些用法align_state
对我来说不是很清楚。它在几个地方被设置为 1000000(§88、§331、§482、§483、§486、§785、§789、§791)。它在 §339、§774 和 §777 中被设置为 −1000000。它在 §324 和 §778 中被设置为 0。因此,它似乎align_state
比当前组级别略高。
究竟是多少align_state
?将其设置为±1000000有什么意义?
答案1
重点是非零部分:每当 TeX 遇到制表符或\cr
和align_state
为零时,TeX 就会执行代码以插入 vj 模板。
当然,这个可能更明显的用途是确保括号是平衡的,但除此之外,它还用于确保您确实处于对齐中:每当 TeX 超出对齐范围时,align_state
都会设置为 1000000(加上括号平衡)。这确保 TeX 不会尝试插入不存在的 vj 模板(如果您\cr
在对齐之外使用或制表符)。这里的 1000000 没有任何实际意义,除了足够大,可以让对齐中具有大量不匹配括号的文档轻松达到。
类似地,-1000000
(+ 括号平衡) 用作标记,表示您正在阅读对齐前言(同样,制表符和 \cr 不应插入 vj 模板,而应具有自定义含义)。