LaTeX3 是否解决范围(即分组)的问题?

LaTeX3 是否解决范围(即分组)的问题?

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:Nnand \<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可能仍需要注意的领域。可以想象通过使用适当的包装器来处理略显奇怪的行为,以允许“正确”地设置框。这尚未完成,并且会影响性​​能。另一方面,目前对框代码的审查相对较少:这可能会改变。(我已经向团队提出:我有某种计划。)

相关内容