我现在更多地使用 tex,我想通过减少输入来提高效率。我部分地受到编辑 mathjax 帖子和看到人们写类似的东西的启发\frac12
。然而,我也遇到了一些意想不到的错误。
例如,写\eta_\max
会给我带来可怕的错误,这对于调试一长段数学题来说简直是一场噩梦。但是,如果我愿意错误地使用 ,TeX has become confused
我就可以侥幸逃脱。而且一般来说,在 这样的表达式中,不需要带有符号的花括号。\eta_\mathrm{max}
\mathrm
\infty
\int_{-\infty}^\infty
所以我的问题是,什么时候可以不去掉括号,什么时候不可以?我得到错误的原因是什么\eta_\max
?
答案1
当 TeX 寻找宏的强制参数时,有两种情况:
宏后面跟着一个花括号
{
:参数是直到匹配的括号为止的所有内容}
;否则,以下标记(字符或控制序列)就是参数。
因此\frac12
相当于\frac{1}{2}
,因为第一个标记是,1
而下一个标记是2
。
然而,_
和^
宏不同,这也是为什么我们更喜欢总是使用大括号。
_
和TeX 的其他一些原语一样,^
看对于括号,它们会随着操作而扩展。允许使用 for$f'(x)$
而不是 of的技巧$f^{\prime}(x)$
基于此:('
在数学模式下)相当于一个宏,并且使用进一步的属性执行相当多的操作,即 的参数^
(对于 也一样)可以用和_
括起来,而这对于普通宏来说是不允许的。\bgroup
\egroup
那么,当你有 时会发生什么\eta_\max
?TeX 会找到_
,所以它会扩展以下标记(因为它不是{
或\bgroup
),并且 的扩展\max
是
\mathop {\operator@font max}
现在\mathop
不是括号,也不可扩展,因此扫描在此处停止,TeX 发出错误消息,因为\eta_\mathop
是非法的。如果amsmath
加载,则扩展\max
为
\qopname \relax m{max}
并\qopname
扩展为\protect\qopname
,混乱再次出现:\protect
相当于\relax
(在正常情况下),因此被忽略(根据 TeX 规则,要完全解释它需要很长时间)并且以下标记是\qopname
(带有尾随空格),其扩展再次以 开始\mathop
。错误。
X^\notin
和其他几个单一令牌也会发生同样的事情。
为什么\eta_\mathrm{max}
有效?因为\mathrm{max}
本质上
{<choose the upright math font>max}
加上一对额外的括号以保持<choose the upright math font>
局部性。这些括号用于_
标识要排版为下标的材料。
使用牙套,你就不会被奇怪的行为所困扰。
答案2
我不会说你应该总是使用括号,但是如果你省略它们,你应该知道为什么可以省略它们。基本上,只要下标或上标是一个根本不扩展的标记,或者扩展为单个不扩展的标记,或者扩展为括号中的内容,省略括号都是安全的。所以$a_i$
绝对没问题,$x_\alpha$
除非\alpha
以不寻常的方式重新定义(其标准定义是不可扩展的数学符号),并且如果\C
定义为给出复数的符号,那么$f_\C$
可能也不需要括号;但是我说后者只是因为我认为大多数合理的定义要么将其定义为不可扩展的符号,要么使其(最终)扩展为括号中的内容。当然,在无法确定符号如何定义的情况下,使用括号是明智的。
另一方面,几乎可以肯定,无需查看定义,这$\eta_\max$
不会起作用。这是因为\max
不会扩展为单个符号(毕竟其表示包含三个字母),并且由于它应该代表数学运算符,因此其扩展不能用括号括起来:当用括号括起来时,任何具有特定间距规则(关系、运算符)的数学符号都会降级为普通数学符号;为了获得正确的间距\max
必须避免使用大括号括起来的扩展。
根据经验,我认为只有当控制序列指定普通数学类别的单个符号时,才值得检查定义以查看是否可以在控制序列给出的下标和上标中省略括号。所以我会写成$f_{\leq}$
因为\leq
是关系符号(即使它在纯 TeX 中的定义是\mathchardef
,允许省略括号)。对于非活动单个字符,可以省略括号,因此$f_<$
除非已使其成为活动字符,否则应该没问题<
,但应该注意这样的字符'
在数学模式下会变为活动状态。