为什么 TeX 有这么多类别代码?

为什么 TeX 有这么多类别代码?

当我看到长长的类别代码列表时,我根本不明白为什么它们都是需要的。例如:

  • $、、、和可以很容易地被定义为活动字符^_&
  • 说到&,为什么要在制表符对齐上浪费这么常见的符号?为什么不使用类似于\nc“新列”的符号?

答案1

当然,并不是所有具有特殊类别代码的角色都可以被替换为主动角色。

类别代码在标记化阶段分配,然后永久附加到字符标记。但是,类别代码为 0 的字符永远不会成为字符标记,因为它只会触发形成控制序列的机制。同样,不可能有类别代码为 5(行尾)、9(忽略)、14(注释)、15(无效)的字符标记。

代码 0、5、9、14 和 15 均触发特殊操作。历史记录:在 TeX78 中,类别代码为%5(不允许像我们现在习惯的那样进行注释)。

类别代码 11 和 12 之间的区别在控制序列的形成过程中至关重要:\a是一个控制字(并且后面的空格会被忽略),而\?是一个控制符号(并且不会忽略空格)。

代码 1 和 2 对于宏定义和参数抓取(和分组)同样重要。代码 10 对于规范化空间和代码缩进至关重要。代码 14 对应于注释,同样重要,代码 6 也很重要,用于表示宏定义(和对齐)中的参数。

现在让我们检查代码 3、4、7、8。可以是它们的原语,例如\mathshift\alignment和。实际上,可以通过以下方式定义\superscript它们\subscripts

\let\mathshift=$
\let\alignment=&
\let\superscript=^
\let\subscript=_

并且普通 TeX 和 LaTeX 确实以完全相同的方式定义\sp\sb

为什么不使用活动字符?活动字符是在 1980 年引入的,那时分类代码业务已经启动。TeX78 只有 13 个代码,所以活动字符占据了下一个位置。我们现在所知道的注释占据了位置 14,而代码 15 是为了处理奇怪的字符,例如 ASCII 127(用于打孔卡,在出现错误时删除前一个字节,以免浪费打孔卡)。

但真正的原因是,活动字符就像宏(更准确地说,是控制序列),可以随时被赋予新的含义。

如果你说,那么就会产生\def\b{foo}\def\a{\b}\def\b{baz}一个 的调用,而不是。\abazfoo

类似地,

\def\splat{\hbox{$\otimes$}}

具有$主动角色不是以防万一\def${foo}之后有人这样做。人们需要一个原语\mathshift来代替$来进行诸如 这样的定义\splat;但问题只会被推到前面:如果有人觉得有必要重新定义 怎么办\mathshift

此外,#如果不改变 TeX 的核心,就无法将其实现为活动字符。也许可以对 进行实现&,但初始含义的原语是必需的,而且问题与之前相同。

偏执?一点也不。网站上曾有人提出问题\foreach \number in {1,2,...,10} {...},抱怨说出了问题。或者说,\foreach \color in {<color list>}{...}情况变得很糟糕。

相关内容