这里有一个小例子可以说明这种奇怪的行为:
\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator\foo{\mathbf{l}}
\begin{document}
baseline$\mathbf{l}$baseline$\mathop{\mathbf{l}}$baseline$\mathop{l}$baseline$\foo$baseline
\end{document}
请注意,显式调用会\mathop
移动 的基线l
。但是如果您使用 ,\DeclareMathOperator
则不会发生这种情况。这是错误还是功能?
我个人认为,如果您在文本中讨论运算符,则移位的基线看起来确实很奇怪,所以我想再次将其上移。除了无休止地使用 之外,我还有其他选择吗\DeclareMathOperator
?
答案1
这是一个特点。以下是摘录自amsopn.dtx
:
在内部,
\mathop
我们需要一个空对象(我们选择零字距以尽量减少主内存的浪费)以防止 #3 是单个字母的情况;如果原子内部没有其他东西,TeX 将抓住它并将其置于数学轴的中心\mathop
。
这是\qopname
其基本定义\DeclareMathOperator
:
\DeclareRobustCommand{\qopname}[3]{%
\mathop{#1\kern\z@\operator@font#3}%
\csname n#2limits@\endcsname}
答案2
“移位”遵循 TeX 规则:当的参数\mathop
由仅限一个字符它以数学轴(分数线所在的位置)为中心;这在 TeXbook 附录 G 规则 13 中有所规定。
对于“一次性”操作符,您可以使用\operatorname
,它可以解决问题(并自动选择)\mathrm
。
$\operatorname{l}$ is different from $\mathop{\mathrm{l}}$
该命令在加载后立即可用amsopn
(与提供的包相同\DeclareMathOperator
);它由 自动加载amsmath
。
*-variant 具有与 类似的效果\DeclareMathOperator*
,因此定义了一个具有限制的数学运算符。
如果获取“正常斜体 l”的输入\operatorname{\mathnormal{l}}
太多,那么
\mathop{\kern0pt l}
更短。
答案3
修复方法\mathop
是在参数中插入空格,例如\hspace
、\kern
或\mbox
。
这具有正确的基线:
\mathop{\mathbf{l}\mbox{}}
也这样:
\mathop{\mathbf{l}\hspace{0pt}}
amsmath
它是否类似,在这里你可以在 within 中看到它\operatorname
,它被\DeclareMathOperator
via调用\@declmathop
:
\DeclareRobustCommand{\qopname}[3]{%
\mathop{#1\kern\z@\operator@font#3}%
\csname n#2limits@\endcsname}