根据我的经验,大多数控制序列都充当隐式组,例如
g^\textrm{th}
。但是,如果我们看下面的例子,第一行会抛出一个错误,而第二行不会。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$g^\mod$
$g^{\mod}$
\end{document}
我第一次注意到这一点是因为我曾经DeclareMathOperator
根据以下问题的答案声明过自己的运算符定义其他要以罗马字体排版的数学运算符。
然后我尝试使用\mod
在中定义的amsmath
与其他控制序列不同,数学运算符不能很好地与 配合的原因是什么?^
是否有一种选项可以使它们在没有明确的情况下做到这一点?{}
答案1
事实上,大多数控制序列确实不是函数作为一个隐式群;你只是在选择上标时很幸运。 \textrm
是一个字体宏,并且经过精心设计,无需上标括号即可工作。如果您要定义自己的宏
\newcommand*\timestwo[1]{2*#1}
你会发现$g^\timestwo{x}$
会被接受,但会产生 的等价结果${g^2} * 2$
。这是因为 TeX 会将“参数”扩展为指数^
,然后取第一个组(或多或少)作为指数的实际文本。(因此,\textrm
通过扩展使其参数周围的组成为^
最终看到的第一个东西来工作。)
类似的事情也发生在 中\mod
,它实际上需要一个参数:\show\mod
在命令行中写入会说
\mod=\long macro:
#1->\allowbreak \if@display \mkern 18mu \else \mkern 12mu\fi {\operator@font mod}\,\,#1.
也就是说,你应该将其用作\mod n
。事实上,这个会给你一个额外的错误,因为 看到的第一个可排版材料^
是\mkern
,而且由于它不可扩展,所以它 a) 确实不是吸收其“参数”(根据上下文,可以是18mu
或12mu
),并且 b) 本身作为指数。\mkern
没有参数的表达式是无效的。
如果你只想要直立排版操作符“mod”,你\DeclareMathOperator{\Mod}{mod}
可以那可以在上标中使用,因为它是一个不带参数的单一标记。