免责声明:我知道定义带有下标或上标的新命令并避免“双下标”错误但这仅提供了一种解决方法,但没有解释我的问题。
以下是该问题的摘要。此代码:
\documentclass{article}
\newcommand*{\one}{a_1} %no explicit brackets
\newcommand*{\two}{{a_1}} %explicit brackets
\begin{document}
$b_\one$ % error: Double subscript
$b_\two$ % no error
\end{document}
Double subscript
给我错误b_\one
。为什么?什么时候需要“范围”括号,什么时候不需要它们?我一直认为由定义的命令\newcommand
是“自动”的单身的单独的“对象”,不需要放在括号内。
问题是不是为什么需要括号(这很清楚),但问题是为什么在使用时在定义中需要它们\newcommand
?
顺便问一下,LaTeX 中“范围”和“对象”的正确“词汇”是什么?
答案1
“由 \newcommand 定义的命令‘自动’成为其自身的单个‘对象’”的程度因上下文而异。
当然,这样的命令是令牌,它是 TeX 解析器中的一个原子对象。当 TeX 读取输入时,它会将任何标记作为一个整体接收,而不管其扩展情况(如果有)。
这也是可扩展令牌,这意味着它是不是TeX 解释器中的一个原子对象。在各种情况下,输入都会被扩展,其中所有可扩展标记(依次从左到右)都会被其含义替换。
这是不是大卫解释说,一个“支撑组”,通常是治疗作为单个对象,特别是当作为宏或类似函数的原始运算符(例如下标符号)的“参数”时。
标记被扩展的情况之一是当下标符号寻找其操作数时;它期望一个括号组或一个字符(或相当于一个字符的控制序列)。因此,\newcommand
如果大多数宏扩展为多个未用括号括起来的标记,则它们不能公开用作下标。
答案2
TeX 中的括号至少有两个不同的用途。它们用于界定宏参数和宏定义,以及用于创建局部组,这两个用途是不同的。
如果你走的话
\def\mybold{\bfseries}
那么{}
只是界定了定义的范围,它不形成限制范围的组\bfseries
(否则该命令根本没有任何用处)
类似地,如果你定义
\def\zz#1{xxx#1yyy}
并将其用作
\zz{abc}
周围{}
的 abc 不构成一个组,并且在收集宏参数后立即被丢弃。如果您执行
\zz{ab\bfseries c}
扩展为
xxxab\bfseries cyyy
没有大括号组并且yyy
加粗。