至少有三种情况,数学模式中的单个符号会被 TeX 引擎特殊处理:1. 当重音被放置时,2. 当使用以下方式创建数学运算符时\mathop
,以及 3. 当重音符号被括号括起来时在每个例子中,TeXbook 都使用不同的词语来代替“单一符号”:
- “单个字符”(第 443 页,规则 12),
- “一个象征”(第 443 页,规则 13),
- “单个 Acc 原子” (第 291 页)。
现在我想知道:这些短语到底是什么意思,例如,什么才算“单个字符”?这三个例子中的意思是否相同?最后:记录在某处到底是什么意思?(我也很乐意参考tex.web
。)
看完之后egreg 的这个评论,在我看来,“单个符号”需要是 类型\mathord
。为了解释原因,我将使用从数学斜体字体中\mathchar
取出字母A
,并测试不同的类别:(\mathord
类别 0)、\mathop
(类别 1)、\mathbin
(类别 2)、\mathrel
(类别 3)、\mathopen
(类别 4)、\mathclose
(类别 5)、\mathpunct
(类别 6)。
下图显示:1. 重音符号仅对 0 类正确放置;2. \mathop
仅对 0 类和 1 类将符号相对于数学轴居中(但对于 1 类,符号已经是类型\mathop
);3. 带重音符号的数量周围的括号会导致上标凸起除非该符号属于 0 类。
\documentclass{article}
\begin{document}
1.\ Accent placement:
$
\hat{\mathchar"0141}
\hat{\mathchar"1141}
\hat{\mathchar"2141}
\hat{\mathchar"3141}
\hat{\mathchar"4141}
\hat{\mathchar"5141}
\hat{\mathchar"6141}
$
2.\ Creating a (centered) math operator:
$
\mathop{\mathchar"0141}
\mathop{\mathchar"1141}
\mathop{\mathchar"2141}
\mathop{\mathchar"3141}
\mathop{\mathchar"4141}
\mathop{\mathchar"5141}
\mathop{\mathchar"6141}
$
3.\ Enclosing an accented quantity in braces:
$
{\hat{\mathchar"0141}}^H
{\hat{\mathchar"1141}}^H
{\hat{\mathchar"2141}}^H
{\hat{\mathchar"3141}}^H
{\hat{\mathchar"4141}}^H
{\hat{\mathchar"5141}}^H
{\hat{\mathchar"6141}}^H
$
\end{document}
答案1
这是一个棘手的问题。答案是:1) 和 2) 是相同的,但 3) 是完全不同的东西。换句话说,Don 在写“单个字符”和“符号”时有点马虎。在这两种情况下,他的意思是
<math symbol> -> <character> | <math character>
如 TeXbook 第 289 页的 BNF 符号所述。
要理解行为和示例,必须仔细研究代码和/或文档中的其他各个地方,例如tex.web
。理解示例的关键是 TeXbook 中的第 290-291 页。Don 在这里说:
A
<math field>
用于指定原子的原子核、上标或下标。当 a<math field>
为 a时<math symbol>
,该符号的 $f$ 和~$a$ 数字将进入原子域。否则<math field>
以 开头{
,这会导致 \TeX\ 进入新的分组级别并开始新的数学列表;随后<math mode material>
以 结尾}
,此时组结束,生成的数学列表将进入原子域。如果数学列表只是一个没有下标或上标的 Ord 原子,或者是一个原子核为 Ord 的 Acc,则括号会被有效删除。
我们可以通过以下小文档观察这种行为:
\documentclass{article}
\begin{document}
$
A
{A}
{BC}
\hat A
{\hat A}
{\hat {BC}}
\showoutput\showlists
$
\stop
在终端上我们得到:
### math mode entered at line 3
\mathord
.\fam1 A
\mathord
.\fam1 A
\mathord
.\mathord
..\fam1 B
.\mathord
..\fam1 C
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\mathord
..\fam1 B
.\mathord
..\fam1 C
和A
都{A}
产生相同的结果:一个\mathord
原子,其原子核为\fam 1 A
。但{BC}
不同,您会看到里面有额外的 ord 节点。其他三行显示,如果重音是括号内的唯一原子,则重音会“移出”括号。这就是第 291 页上的意思,并回答了问题 3):
单个 Acc 本身就是一个 Acc 原子,例如,\hat{BC}
是一个,即使它的原子核内部有 2 个数学符号。
现在来创建数学重音符号或数学运算符:您的示例似乎表明“单个字符”或“符号”仅指 Ord 原子。但事实并非如此,您的示例之所以如此表现,是因为上述行为定义。如果我们通过删除每行中的 来<math field>
检查您的示例,例如,\hat
$
{\mathchar"0141}
{\mathchar"1141}
{\mathchar"2141}
{\mathchar"3141}
{\mathchar"4141}
{\mathchar"5141}
{\mathchar"6141}
\showoutput\showlists
我们得到
### math mode entered at line 3
\mathord
.\fam1 A
\mathord
.\mathop
..\fam1 A
\mathord
.\mathbin
..\fam1 A
\mathord
.\mathrel
..\fam1 A
\mathord
.\mathopen
..\fam1 A
\mathord
.\mathclose
..\fam1 A
\mathord
.\mathpunct
..\fam1 A
我们可以看到,除了第一行之外,外层\mathord
(即我们的数学域)不仅包含\fam1 A
另一个原子,即一个两级结构,而不是一个符号。因此,如果它成为 Acc 原子的原子核,它首先会变成一个盒子,里面可能有一些空间,然后放置重音,这就是差异的原因。
为了证明我的观点,让我们删除示例中的括号,这将给出非常难以阅读但完全有效的代码(因为 single<math symbol>
是 的一种可能性,<math field>
并且\mathchar
是这样的符号,请参阅第 289 页的 BNF 表示法):
$
\hat\mathchar"0141
\hat\mathchar"1141
\hat\mathchar"2141
\hat\mathchar"3141
\hat\mathchar"4141
\hat\mathchar"5141
\hat\mathchar"6141
\showoutput\showlists
现在我们突然发现,事实上任何操作<math symbol>
都是可能的,只要它不是括号中更大子公式的一部分,就没有区别。
### math mode entered at line 3
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
\accent\fam0 ^
.\fam1 A
当然,如果你尝试生成 ,情况也是如此\mathop
。问题是,当你使用{...}
里面的东西时,它就变成了一个复杂的结构(一个数学列表),即使你只在里面放了一个原子,除非 --- 这是 TeXbook 上一段中记录的例外 --- 这个单个原子是 Ord 原子或 Acc 原子。
(深呼吸)...感觉有点像 TeXbook p125 :-)