存在哪些 mode 和 \currentgrouptype 的组合?

存在哪些 mode 和 \currentgrouptype 的组合?

我试图预测在任何给定情况下,如果右括号到达 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

  1. 简单组。任何模式。右括号结束该组。

  2. hbox 组。限制水平模式。右括号结束组和框。

  3. 调整后的 hbox 组。参见 hbox 组,但后期处理有所不同。

  4. vbox 组。内部垂直模式。使用基本符号 结束任何段落\par,然后结束组和框。

  5. vtop 组。参见 vbox 组,但后期处理有所不同。

  6. 对齐组(\halign{#\cr...}\valign)。在 内\halign,限制水平模式;在 内\valign,内部垂直模式或(外部)水平模式。右括号会引发错误Missing \cr inserted,插入\cr,然后是右括号。这结束了对齐。

  7. 无对齐组 ( \noalign{...})。在 内\halign,内部垂直模式或(外部)水平模式;在 内\valign,受限水平模式。右括号结束任何段落、结束当前水平或垂直模式、组,并向前查找另一个\noalign、 或 \omit等。

  8. 输出组。内部垂直模式或(外部)水平模式。右括号通常会导致错误,除非右括号本身插入\output,或者使用 跳过它\expandafter。如果右括号没有问题,则组结束,垂直材料将放入主垂直列表中,TeX 检查是否为\box255空,否则会引发错误。

  9. 数学组(${...}$)。(内部)数学模式。右括号结束该组,并从当前数学列表中构建一个原子。

  10. 磁盘组(\discretionary{...}{...}{...})。受限水平模式。右括号结束当前自由列表(与 的内容大致相同\hbox,但有更多限制);如果这是 的第三个参数\discretionary,则测量三个列表,并在当前水平列表中插入一个自由节点。

  11. 插入组(\insert0{...}\vadjust{...}(感谢 egreg))。内部垂直模式,或(外部)水平模式(开始一个段落后)。右括号通过调用原语来结束任何段落\par。然后\insert(或\vadjust)执行其操作。

  12. vcenter group(\vcenter{...})。参见插入组,但后期处理有所不同。

  13. 数学选择组(\mathchoice{...}{...}{...}{...})。(内部)数学模式。右括号结束当前列表,请参阅自由选择组。

  14. 半单群(\begingroup...\endgroup)。任何模式。右括号会导致错误并被忽略。

  15. 数学移位组($...$$$...$$)。任一数学模式。右括号会导致错误并被忽略。

  16. 数学左组(\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 可能会从水平模式改回内部垂直模式以完成手头的任务(永远不会从内部垂直模式改回水平模式)。

相关内容