自定义命令的上标和下标行为特化

自定义命令的上标和下标行为特化

我定义了一些命令,例如

\newcommand{\expec}[1]{\mathbb E\left[#1\right]}

这个命令对我来说真的很有用。但是,现在我需要写出对随机变量的期望,我会将其写为

\mathbb E_{X\sim F}\left[g(X)\right]

我的问题是,我可以重载_运算符,\expec以便\expec_{1}{2}渲染如下\mathbb E_{1}\left[2\right]

我想避免重新定义新命令(带有 2 个参数),因为我最终也需要使用上标,然后我将总共需要 4 个新命令。

我尝试使用可选参数ifthenelse,但这不是很好,因为如果我使用它,我必须将所有先前的实例更改为\expec包含一组空花括号。

我意识到超负荷可能不是最好的主意,所以我也愿意接受其他想法

答案1

Mico 和 David 的答案的结合。查看最后两个示例,了解为什么\left\right(在 6 中使用)不是很好。

\documentclass{article}
\usepackage{amsmath,mathtools,amssymb}

\NewDocumentCommand{\expec}{e{_^}}{%
  \mathbb{E}%
  \IfValueT{#1}{_{#1}}%
  \IfValueT{#2}{^{#2}}%
  \expecaux
}
\DeclarePairedDelimiter{\expecaux}{[}{]}

\begin{document}

\begin{gather}
\expec{X} \\
\expec_{1}{X} \\
\expec^{n}{X} \\
\expec_{1}^{n}{X} \\
\expec_{1}^{n}[\bigg]{\sum_{k=1}^n a_k} \\
\expec_{1}^{n}*{\sum_{k=1}^n a_k}
\end{gather}

\end{document}

在此处输入图片描述

我们还可以将*或可选参数移到后面\expec

\documentclass{article}
\usepackage{amsmath,mathtools,amssymb}

\NewDocumentCommand{\expec}{soe{_^}}{%
  \mathbb{E}%
  \IfValueT{#3}{_{#3}}%
  \IfValueT{#4}{^{#4}}%
  \IfBooleanTF{#1}{% * version
    \expecaux*%
  }{%
    \IfNoValueTF{#2}{\expecaux}{\expecaux[#2]}%
  }%
}
\DeclarePairedDelimiter{\expecaux}{[}{]}

\begin{document}

\begin{gather}
\expec{X} \\
\expec_{1}{X} \\
\expec^{n}{X} \\
\expec_{1}^{n}{X} \\
\expec[\bigg]_{1}^{n}{\sum_{k=1}^n a_k} \\
\expec*_{1}^{n}{\sum_{k=1}^n a_k}
\end{gather}

\end{document}

随意选择。

答案2

您可以使用e参数类型定义您所建议的内容,但将这些参数定义为位于主参数之前可能更自然,因为它们就是这样排版的。我在这里展示了两个版本。

在此处输入图片描述

\documentclass{article}
\usepackage{amsfonts,mleftright}
\NewDocumentCommand{\expec}{me{_^}}{%
    \mathbb{E}%
    \IfNoValueF{#2}{_{#2}}%
    \IfNoValueF{#3}{^{#3}}%
    \mleft[#1\mright]}

  \NewDocumentCommand{\expecb}{e{_^}m}{%
    \mathbb{E}%
    \IfNoValueF{#1}{_{#1}}%
    \IfNoValueF{#2}{^{#2}}%
    \mleft[#3\mright]}
\begin{document}


$\expec{X} + \expec{X}_{1} + \expec{X}_{1}^{n} $

\bigskip

$\expecb{X} + \expecb_{1}{X} + \expecb_{1}^{n}{X} $

\end{document}

答案3

我建议你利用数学工具包(该包的超集amsmath)及其\DeclarePairedDelimiterXPP宏。

在此处输入图片描述

\documentclass{article}
\usepackage{amssymb}   % for '\mathbb' macro
\usepackage{mathtools} % for '\DeclarePairedDelimiterXPP' macro
\DeclareMathOperator{\E}{\mathbb{E}} % unconditional expectation operator
\DeclarePairedDelimiterXPP{\expec}[2]{\E^{}_{#1}}[]{}{#2}

\begin{document}
$\E[g(X)] \quad \expec{}{g(X)} \quad \expec{X\sim F}{g(X)}
\quad \expec*{X\sim F}{\dfrac{g(X)}{h(X)}}$
\end{document}

相关内容