我想定义一个数学运算符,例如期望运算符,它可以选择性地接收下标和/或上标。
目前我所拥有的是
\newcommand{\E}[1]{\mathbb{E}\left(#1\right)}
然后我用 来调用它\E{X}
。这很好,但是当我想添加下标时,我却失败了,\mathbb{E}_x\left(X\right)
这很烦人。
因此我定义了另一个命令:
\newcommand{\Ex}[2]{\mathbb{E}_{#1}\left(#2\right)}
但这实际上没有什么帮助,原因有二:(a)我需要记住两个命令,(b)使用不直观(我使用它来\E{x}{X}
代替类似的东西\E_x{X}
。
我可以定义一个数学运算符,其用法如下:
\E{X}
\E_x{X}
\E^2{X}
每种情况下的输出为
\mathbb{E}\left(X\right)
\mathbb{E}_x\left(X\right)
\mathbb{E}^2\left(X\right)
这可能吗?
注意DeclareMathOperator*
对于该任务来说并不好,因为在显示模式下它将下标/上标放在运算符的下方/上方。
答案1
的实现\E
,在强制参数前有可选的下标或上标。它使用\mleft
和\mright
来避免额外的水平间距。
\documentclass{article}
\usepackage{mleftright}
\usepackage{amssymb}
\makeatletter
\newcommand*{\E}{%
\def\E@sub{}%
\def\E@sup{}%
\E@scripts
}
\newcommand*{\E@scripts}{%
\@ifnextchar_\E@subscript{%
\@ifnextchar^\E@supscript\E@finish
}%
}
\def\E@subscript_#1{%
\ifx\E@sub\@empty
\def\E@sub{#1}%
\else
\errmessage{E already has a subscript}%
\fi
\E@scripts
}
\def\E@supscript^#1{%
\ifx\E@sup\@empty
\def\E@sup{#1}%
\else
\errmessage{E already has a superscript}%
\fi
\E@scripts
}
\newcommand*{\E@finish}[1]{%
\mathbb{E}%
\ifx\E@sub\@empty\else _{\E@sub}\fi
\ifx\E@sup\@empty\else ^{\E@sup}\fi
\mleft(#1\mright)%
}
\makeatother
\begin{document}
\[ \E{X}, \E_x{X}, \E^2{X}, \E_x^2{X}, \E^2_x{X} \]
\end{document}
答案2
我不会让宏\E
接受显式参数。相反,我会\E
通过\DeclareMathOperator
语句定义,然后写入\E(X)
、\E X
等。这样,您就可以“即时”决定是否使用括号。
请注意,这种方法不需要在输入期间进行额外输入:您只需\E{X}
用\E(X)
完全相同数量的字符替换即可。:-)
\documentclass{article}
\usepackage{amsmath,amssymb}
\DeclareMathOperator{\E}{\mathbb{E}}
\begin{document}
$\E(K)$, $\E_x(K)$, $\E^2(K)$, $\E_x^2(K)$
\medskip
$\E K$, $\E_x K$, $\E^2 K$, $\E_x^2 K$
\end{document}