TeX 作用域是一个非常复杂且晦涩难懂的主题。无法直观地看出作用域何时开始和结束,以及它到底影响了什么。由于作用域是每种编程语言的基本构建块之一,因此在我看来,这是 TeX 的一个方面,迫切需要从头开始彻底改革。LaTeX3 解决了这个问题吗?
有人问我:
什么意思:[视觉上无法辨别]
我甚至没有谈论像
\def\mymac{a}%
\input enigma %redefines \begingroup and \endgroup as \relax
\begingroup%
\def\mymac{b}%
\endgroup%
\mymac%
\bye%
哪些排版
b
(看得出来吗?)
我说的是正常的例子,比如{...}
in\def<control sequence>{...}
并不意味着分组,但{...}
in\output{...}
确实意味着分组,然而{...}
in\mymacro{...}
并不意味着分组,而{...}
in\loop{...}\repeat
确实意味着分组。
我说的是它\setbox<number> = ...
是局部的,但是\ht<number> = ...
是全局的(你能通过视觉看出来吗?),当你创建一个普通的 TeX 框时,当前字体将被捕获在框中,但当前颜色不会。
这只是为了让您尝尝鲜。
答案1
LaTeX3(尤其是expl3
编程层)是用 TeX 编写的,因此最终无法改变 TeX 的工作方式。但是,它可以提供文档化的接口,详细说明如何使用特定概念。
对于分组,expl3
因此必须与 TeX 使用的各种构造一起工作。主要的是{
/ }
(catcode 1/2 对组)和\begingroup
/ \endgroup
(半简单组):后者在 中expl3
被重命名为\group_begin:
/ \group_end:
。它们的工作方式很简单:它们创建一个组,其中本地分配将被“捕获”。反映这一点,expl3
提供了一系列\<thing>_set:Nn
and \<thing>_gset:Nn
(或类似)宏,它们可以本地或全局设置<thing>
。后者通常是一个变量,例如\l_tmpa_tl
(要本地设置的标记列表)、\g_tmpb_clist
(要全局设置的逗号列表),ETC。
有些 TeX 构造只能全局设置。但是,这些构造大多是低级的,通常不由 公开expl3
。如果存在,文档会明确指出必须使用全局接口来处理它们:它们将被命名\g_...
。(例如,\prevgraf
是不是但l3galley
有一个\g_galley_previous_par_lines_int
变量涵盖了相同的概念。
由于 LaTeX3/expl3
仍在开发中,有些地方 TeX 基元尚未覆盖,或者可能仍需要进行一些更改(盒子尺寸可能属于后者)。但是,总体方法很明确:记录范围、适当命名并为一系列低级概念提供高级接口。
问题中的一个例子是{
...}
可能用于(至少)两个原因:
- 要创建一个平衡文本争论
- 用于分组
当 TeX 确定某事物是平衡文本因为它使用 begin-group 和 end-group 标记作为组括起来。但是,对于expl3
代码,我们倾向于(按照惯例)仅使用\group_begin:
/\group_end:
进行分组:因此,代码中出现的任何{
...}
对都是参数。
在设置框高度/深度/宽度的示例中,这是一个expl3
可能仍需要注意的领域。可以想象通过使用适当的包装器来处理略显奇怪的行为,以允许“正确”地设置框。这尚未完成,并且会影响性能。另一方面,目前对框代码的审查相对较少:这可能会改变。(我已经向团队提出:我有某种计划。)