\newcommand 出现双下标错误?

\newcommand 出现双下标错误?

免责声明:我知道定义带有下标或上标的新命令并避免“双下标”错误但这仅提供了一种解决方法,但没有解释我的问题。

以下是该问题的摘要。此代码:

\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加粗。

相关内容