mathop 移动基线,而 DeclareMathOperator 不移动

mathop 移动基线,而 DeclareMathOperator 不移动

这里有一个小例子可以说明这种奇怪的行为:

\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,它被\DeclareMathOperatorvia调用\@declmathop

\DeclareRobustCommand{\qopname}[3]{%
  \mathop{#1\kern\z@\operator@font#3}%
  \csname n#2limits@\endcsname}

答案4

我不知道 LaTeX 的情况,但在纯 TeX 中,以下两个解决方案在上标方面有所不同,但在下标方面相同:\mathop{\kern0pt\bf P}\nolimits^H_x\mathop{\hbox{}{\bf P}}\nolimits^H_x。后者保留了上标的位置\mathord,因为{\bf P}^H_x。以下是 4 种可能性的说明:

${\bf P}^H_x 
\mathop{\kern0pt\bf P}\nolimits^H_x
\mathop{\bf P\kern0pt}\nolimits^H_x
\mathop{\hbox{}{\bf P}}\nolimits^H_x$

在此处输入图片描述

相关内容