我试图预测在任何给定情况下,如果右括号到达 TeX 的胃部,TeX 会做什么(除了恢复本地分配)。例如,\vbox{\tracingall H}
显示如果在关闭 vbox 时处于水平模式,则 TeX 会先将当前段落切成行,然后再离开 vbox 组。确定 TeX 做什么的一种方法是列出可能发生的所有组类型和模式组合,以及要采取的相应操作。
这是合理的方法吗?如果是,那列表是什么?还有更好的方法吗?为了参考,我在下面列出了模式和组类型。
TeX 有六种模式(参见 TeXbook 第 13 章):
- 垂直模式。
- 内部垂直模式。
- 水平模式。
- 受限水平模式。
- 显示数学模式。
- 数学模式。
根据 eTeX 手册,TeX 知道 17 种组类型,我们可以通过以下方式访问这些信息\currentgrouptype
:
- 最底层(无组) (0)
- 单群 (1)
- 水平盒组 (2)
- 调整水平盒组 (3)
- 垂直框组 (4)
- vtop 组 (5)
- 对齐组 (6)
- 无对齐组 (7)
- 输出组 (8)
- 数学组 (9)
- 光盘组 (10)
- 插入组 (11)
- vCenter 组 (12)
- 数学选择组 (13)
- 半单群 (14)
- 数学转变组 (15)
- 数学左组(16)
答案1
让我逐一回答}
一下看到 时会发生什么的问题。TeX 位于命令no mode
内\write
,可以出现在任何类型的组中,因此我将忽略这种情况。
底层(其中\currentgrouptype
为 0)可以出现在(外部)垂直模式或(外部)水平模式中。它不能出现在内部垂直模式或受限水平模式中,因为框会启动组。它不能出现在任何数学模式中,因为这些数学模式也会启动组。在这种情况下,右括号会触发错误Too many }'s
。
简单组。任何模式。右括号结束该组。
hbox 组。限制水平模式。右括号结束组和框。
调整后的 hbox 组。参见 hbox 组,但后期处理有所不同。
vbox 组。内部垂直模式。使用基本符号 结束任何段落
\par
,然后结束组和框。vtop 组。参见 vbox 组,但后期处理有所不同。
对齐组(
\halign{#\cr...}
或\valign
)。在 内\halign
,限制水平模式;在 内\valign
,内部垂直模式或(外部)水平模式。右括号会引发错误Missing \cr inserted
,插入\cr
,然后是右括号。这结束了对齐。无对齐组 (
\noalign{...}
)。在 内\halign
,内部垂直模式或(外部)水平模式;在 内\valign
,受限水平模式。右括号结束任何段落、结束当前水平或垂直模式、组,并向前查找另一个\noalign
、 或\omit
等。输出组。内部垂直模式或(外部)水平模式。右括号通常会导致错误,除非右括号本身插入
\output
,或者使用 跳过它\expandafter
。如果右括号没有问题,则组结束,垂直材料将放入主垂直列表中,TeX 检查是否为\box255
空,否则会引发错误。数学组(
${...}$
)。(内部)数学模式。右括号结束该组,并从当前数学列表中构建一个原子。磁盘组(
\discretionary{...}{...}{...}
)。受限水平模式。右括号结束当前自由列表(与 的内容大致相同\hbox
,但有更多限制);如果这是 的第三个参数\discretionary
,则测量三个列表,并在当前水平列表中插入一个自由节点。插入组(
\insert0{...}
或\vadjust{...}
(感谢 egreg))。内部垂直模式,或(外部)水平模式(开始一个段落后)。右括号通过调用原语来结束任何段落\par
。然后\insert
(或\vadjust
)执行其操作。vcenter group(
\vcenter{...}
)。参见插入组,但后期处理有所不同。数学选择组(
\mathchoice{...}{...}{...}{...}
)。(内部)数学模式。右括号结束当前列表,请参阅自由选择组。半单群(
\begingroup...\endgroup
)。任何模式。右括号会导致错误并被忽略。数学移位组(
$...$
或$$...$$
)。任一数学模式。右括号会导致错误并被忽略。数学左组(
\left(...\right)
)。任一数学模式。右括号会导致错误并被忽略。
请注意,当类似垂直框的组结束时,\par
将插入 的原始含义以结束任何段落,而不是标记的当前含义\par
。当框结束时,它要么被放入当前列表 ( \hbox{...}
),要么被分配给框寄存器 ( \setbox0\hbox{...}
),等等。在所有情况下,如果组结束,\aftergroup
标记将插入到右括号后。
答案2
摘自 TeXbook 第 279 页第 24 章,垂直模式总结
•
}
。这个比较难,因为它取决于当前组。TeX 现在应该在以 开头的组上工作{
;并且它知道为什么启动该组。因此,它会执行适当的结束操作,撤消非全局分配的效果,然后离开该组。此时,TeX 可能会离开其当前模式并返回到之前有效的模式。
该组可以是 1 至 13 之间的任意类型。类型 14 由 启动\begingroup
,类型 15 由启动$
,类型 16 由\left
或 启动\middle
。
对于类型 1、2、3、6、8、9、10、13,在 TeX 退出组之前模式不会改变(退出后可以改变)。对于类型 4、5、7、11、12,TeX 可能会从水平模式改回内部垂直模式以完成手头的任务(永远不会从内部垂直模式改回水平模式)。