据我了解,LaTeX 中的标记化x_\text y
将分为
x
_
\text
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