我想定义一组具有相同上标但不同下标的数学运算符。我的第一次尝试是:
\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}