我定义了一些命令,例如
\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}