\DeclareMathOperator 不接受参数

\DeclareMathOperator 不接受参数

我想定义一组具有相同上标但不同下标的数学运算符。我的第一次尝试是:

\DeclareMathOperator{\Upd}[1]{U^M_{#1}}

但日志告诉我:

l.3 \DeclareMathOperator{\Upd}[1
                                ]{U^M_{#1}}
! Missing $ inserted.
<inserted text> 
                $
l.3 \DeclareMathOperator{\Upd}[1]{U^
                                    M_{#1}}
! You can't use `macro parameter character #' in math mode.
l.3 \DeclareMathOperator{\Upd}[1]{U^M_{#
                                        1}}
! Extra }, or forgotten $.
l.3 \DeclareMathOperator{\Upd}[1]{U^M_{#1}}

这是一种解决方法,但并不理想。

\newcommand\UPD[1]{\mathop{\mathrm{U}^\mathrm{M}_\mathrm{#1}}}

有没有办法提出\DeclareMathOperator论点,或者我只能坚持解决这个问题?

答案1

使用这种结构的更好方法是说

\newcommand{\Upd}{\operatorname{U}^{\mathrm{M}}}

然后,人们可以使用不比允许的\Upd_{1}更难编写的版本。\Upd{1}\newcommand{\Upd}{\operatorname{U}^{\mathrm{M}}_{#1}}

当然,放进去\ensuremath会破坏东西,但没必要。此外

$\Upd_{1}$

比 更清晰的输入\Upd{1}

该命令\operatorname{U}只是 的一个包装\mathop{<font setup>U}\nolimits,其中<font setup>包含一些与本讨论无关的指令。当有人说

\mathop{<f>}\nolimits^{<a>}_{<b>}

其中<f><a><b>任意子公式,TeX 处理整个街区作为数学运算符,就间距而言。因此,按照我推荐的定义,输入\Upd_{1}最终将变成

\mathop{<font setup>U}\nolimits^{\mathrm{M}}_{1}

这将用作数学运算符。无需将上标或下标推入 内\mathop。这很常见:当写 时$a=_{t}b$,整个=_{t}将被视为关系符号,周围有正确的间距。

从技术上讲,\mathop{<f>}构建子公式<f>并将其指定为 MathOp 原子的主字段;每个数学原子都有另外两个字段,分别用于上标和下标,如果存在,则不会影响原子的类型。

最后,\DeclareMathOperator\operatorname不应被认为是获取直立字母的方法;直立字母是通过获得的\mathrm;这两个命令确实是用直立字母写出它们的参数,但它们主要做的是准备正确的间距。

\nolimits使用时省略命令,\operatorname*但这是另一个主题。

答案2

要引入参数,您可以结合定义运算符和命令:

\DeclareMathOperator{\UpdOp}{U}
\newcommand\Upd[1]{\UpdOp^M_{#1}}

也可以使用带星号的版本

\DeclareMathOperator*{\UpdOp}{U}

导致\Upd在内联数学模式下上标和下标在右侧,而在显示数学模式下上标和下标在上方和下方。

我假设您也希望在 operatorfont 中使用 M。那么,为什么不定义运算符和命令呢:

\DeclareMathOperator{\UpdOp}{U}
\DeclareMathOperator{\MOp}{M}
\newcommand\Upd[1]{\UpdOp^{\MOp}_{#1}}

您还可以在这里使用带星号的版本,这里是它如何以内联方式显示的输出:

带下标参数的运算符

更简短,正如评论中所讨论的:

\newcommand{\Upd}{\operatorname{U}^{\operatorname{M}}}

\operatorname{U^M}反而会导致错误的下标间距。

如果使用运算符字体的下标,这段代码会变得更长,但 Boris 展示了一个简短的工作版本,这里稍作修改:

\newcommand{\Upd}[1]{\operatorname{U^M_{#1}}}

或者将星号\DeclareMathOperator与操作员字体上下标以及主操作员的自动调整限值结合起来:

\DeclareMathOperator*{\UpdOp}{U}
\newcommand\Upd[1]{\UpdOp^{\operatorname{M}}_{\operatorname{#1}}}

答案3

与 不同\newcommand\DeclareMathOperator没有参数。如果需要参数,请使用\newcommand。如果希望示例中的 U 看起来像运算符,可以使用\operatorname提供的便捷命令amsmath。此外,在定义中使用也是一个好主意\ensuremath,这样您的运算符也可以在文本中工作。

这导致了以下解决方案:

\documentclass{article}
\pagestyle{empty}
\usepackage{amsmath}
\newcommand{\Upd}[1]{\ensuremath{\operatorname{U_M^{#1}}}}
\begin{document}
  $\Upd{a} (x)$
\end{document}

在此处输入图片描述

相关内容