\operatorname{\text{$...$}} 的奇怪行为

\operatorname{\text{$...$}} 的奇怪行为

为什么*第一个例子是凸起的,而第二个例子不同?

\documentclass{article}

\usepackage{amsmath}

\begin{document}

$ \operatorname{\text{$*$}hello} $
vs.
$ *\operatorname{hello} $

\end{document}

在此处输入图片描述

答案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

相关内容