何时应使用 \begingroup 而不是 \bgroup?

何时应使用 \begingroup 而不是 \bgroup?

\begingroup有没有哪种情况比更适合使用\bgroup?显然,\bgroup在需要平衡括号而不能使用 的情况下 是必要的{,但什么时候需要使用 呢\begingroup

一个相关的问题是:简单群和半简单群有什么区别?

答案1

\bgroup是 的同义词{,它在 Plain TeX 中使用 定义\let\bgroup={

它以复杂的方式与 TeX 的“消化系统”交互:{s 和\bgroups 开始相同类型的组,称为简单组,并且每个组都可以用}s 或\egroups 终止,因为它们是相同的。但是当 TeX 消化系统遇到它们时,它们具有不同的 catcode,因此向前看的命令(例如在 LaTeX 中使用\section\bgroup Title})可能会破坏这种匹配。

\begingroup是不同的。它是 TeX 基元,它与 TeX 单独考虑的另一种组相匹配,称为“半简单组”(我猜是 Knuth 的笑话)。因此, 必须\begingroup以 结尾\endgroup,而不是},反之亦然\endgroup

我一般会避免\bgroup使用,而使用\begingroup,但\bgroup如果你正在处理嵌套的标记列表,它可能会很有用。

答案2

\bgroup我对versus 的看法与之前的回答略有不同\begingroup。首先,我简要解释一下 TeX 内部结构:

and {}更准确地说是 catcode 为 1 和 2 的标记)在 TeX 中有四种不同的含义:

  • 它们是宏定义的语法部分:\def\foo...{...}

  • 在 TeX 中作为单个标记列表扫描的每个标记序列(即在宏的参数中、在宏定义内……)都必须通过这些标记来平衡文本:\macro{param{e}ter}

  • 它们是几个TeX原始构造的一部分,例如\hbox...{...},,$e^{...}$\write...{...}

  • 当它们在没有任何上述上下文的情况下使用时,它们会打开和关闭组。

和由\bgroup\egroup声明\let\bgroup={ \let\egroup=},您只能在上述第三和第四种含义中用 和 替换和。{例如:}\bgroup\egroup

\hbox ... \bgroup ...}
\hbox ... {...\egroup
\hbox ... \bgroup ...\egroup
$e^\bgroup ...}$, $e^\bgroup...\egroup$
\write ...\bgroup ...}

示例中的最后一行是另一个例外:如果应用了\egroup句法规则<general text>(如参数中),则不能用 替换右括号。\write

上面第三种含义中提到的没有上下文的and用来打开和关闭一个组\bgroup\egroup同一项工作执行原始命令\begingroup\endgroup但只能这样做。它们不能代替上述第一至第三种含义中的{和。}

这意味着您始终可以使用\begingroup\endgroup,也可以使用\bgroup和,\egroup效果相同。但嵌套组必须由相应的对应项终止,它们不能交叉。在数学模式下,行为略有不同,请参阅注释。

我更喜欢\bgroup和,\egroup而不是\begingroup\endgroup。只有当我发现嵌套组交叉错误对我的宏的用户有用时,我才会使用\begingroup\endgroup

相关内容