当我看到长长的类别代码列表时,我根本不明白为什么它们都是需要的。例如:
$
、、、和可以很容易地被定义为活动字符^
。_
&
- 说到
&
,为什么要在制表符对齐上浪费这么常见的符号?为什么不使用类似于\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}
一个 的调用,而不是。\a
baz
foo
类似地,
\def\splat{\hbox{$\otimes$}}
具有$
主动角色不是以防万一\def${foo}
之后有人这样做。人们需要一个原语\mathshift
来代替$
来进行诸如 这样的定义\splat
;但问题只会被推到前面:如果有人觉得有必要重新定义 怎么办\mathshift
?
此外,#
如果不改变 TeX 的核心,就无法将其实现为活动字符。也许可以对 进行实现&
,但初始含义的原语是必需的,而且问题与之前相同。
偏执?一点也不。网站上曾有人提出问题\foreach \number in {1,2,...,10} {...}
,抱怨说出了问题。或者说,\foreach \color in {<color list>}{...}
情况变得很糟糕。