为什么 `x_\text y` 有效?

为什么 `x_\text y` 有效?

据我了解,LaTeX 中的标记化x_\text y将分为

  1. x
  2. _
  3. \text
  4. y

现在_将使用/绑定到下一个标记。但是,\text也接受一个参数。如果_使用\text,则后者没有参数。

当我做类似的事情时\frac 1 \sqrt 2,与第一个相比,它不起作用,这是我会接受的行为。

为什么第一个例子能够起作用呢?

答案1

您必须知道_(当然是在数学模式下,并且使用类别代码的正常设置)将扩展下一个标记,以查看后面是否有括号(显式或隐式)。这对于需要将 a<general text>作为参数的基元来说很常见(例如\uppercase,也是如此)。

因此_将尝试扩展以下标记,因为它不是{\bgroup。的第一级扩展\text

\protect\text•

(其中表示控制序列名称中的空格)。由于我们处于正常情况(排版),\protect因此 相当于\relax。这里又引入了另一个特性:当<general text>查找 a 时,空格和标记会被忽略(在 TeXbook 中\relax它们被称为 a ),因此 this会消失。现在不是括号,因此 TeX 会继续扩展它;第一级扩展是<filler>\protect\text•

\ifmmode\expandafter\text@\else\expandafter\mbox\fi

好的,我们进入数学模式,所以我们剩下

\expandafter\text@\else\expandafter\mbox\fi

嗯,\expandafter不是括号,展开它!这会导致展开\else,因此只剩下。我们差不多就到了!中\text@的定义是\text@amstext.sty

\def\text@#1{{\mathchoice
  {\textdef@\displaystyle\f@size{#1}}%
  {\textdef@\textstyle\f@size{\firstchoice@false #1}}%
  {\textdef@\textstyle\sf@size{\firstchoice@false #1}}%
  {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}%
  \check@mathfonts
  }%
}

因此,由于 TeX 想要扩展它,因此会查找参数;它y是一个不是括号的标记,用于分隔参数,因此它这个论点。

然后扩展

{\mathchoice...}

y代替#1。太好了!左括号已经找到!继续排版下标。

最后要说的是:始终使用括号括住下标和参数;这样你的输入会更清晰。因此

$x_{\text{y}}$

仅此而已。

答案2

\text定义amstext.sty\text@

\text@ #1->{\mathchoice{...}\check@mathfonts}

它在扩展文本周围添加了括号。因此,扩展中的括号\text@将包含索引中的所有内容。

例如比较一下:

\def\bad#1{\rm #1}
\def\good#1{{\rm #1}}
% $x_\bad y$% <- Missing { inserted
$x_\good y$
\bye

相关内容