声明一个灵活的数学运算符(例如期望运算符)

声明一个灵活的数学运算符(例如期望运算符)

我想定义一个数学运算符,例如期望运算符,它可以选择性地接收下标和/或上标。

目前我所拥有的是

\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}

相关内容