答案1
这是 的设计\operatorname
。在 的文档中amsopn
我们读到:
在运算符名称中,有时需要使用文本模式标点符号,例如 *-/:'。由于运算符名称的主体是在数学模式下设置的,因此这些标点符号不会正确显示(错误的符号/和或错误的间距)。\newmcodes@ 的目的是使它们像其正常文本版本一样运行。
定义\newmacodes@
是:
\gdef\newmcodes@{\mathcode‘\’39\mathcode‘\*42\mathcode‘\."613A%
因此, 的数学代码*
在 中发生了变化\operatorname
。
答案2
\operatorname
和\DeclareMathOperator
的操作\newmcodes@
定义为
% amsopn.sty, line 30:
\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
\ifnum\mathcode`\-=45 \else
\mathchardef\std@minus\mathcode`\-\relax
\fi
\mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
并且进入文本模式\text
不会反转分配。星号现在取自文本字体,与字母使用的相同。
也许\text
应该撤销这项任务,但这种情况已经持续了超过四分之一个世纪,所以......
另一方面,您会注意到没有设置\ast
。
\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator{\bad}{{*}hello}
\DeclareMathOperator{\good}{{\ast}hello}
\begin{document}
This has a raised asterisk $\bad$
This has a centered asterisk $\good$
\end{document}
答案3
既然你说你正在尝试解决\operatorname
处理标点符号的方式,那么你可能遇到了 XY 问题。定义一个使用相同字体和间距排版但不执行上述操作的新命令可能对你有用:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand\varopname[1]{\mathop{\operator@font #1}\nolimits}
\makeatother
\begin{document}
$\varopname{*hello}$
\end{document}
您还可以定义一个不带的版本\nolimits
和一个等效的版本\DeclareMathOperator
。