使用命令格式化期望的问题

使用命令格式化期望的问题

这是最简单的例子

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{amssymb}
\newcommand{\bbE}[1][X]{\mathbb{E}\left[#1\right]}

\begin{document}

Working:
$\bbE[XY]$

Broken:
$\bbE[\bbE[X]] \bbE[\bbE[Y]]$

\end{document}

当我运行这个时,我收到以下错误:

缺少分隔符(插入 .)。

例子

答案1

另一个解决方法:

当 latex 正在寻找外部命令 stop ( ]) 的可选参数时,它会找到第二个(内部)命令的方括号并在那里停止......发生这种情况是因为它与我的第一个定义(参见\def命令)的工作方式类似,其中包含类似的内容\@ifnextchar[并以第一个结束]...通过定义\@lp(左方括号)和\@rp命令,它在第一次从 latex 读取时不会被视为闭括号,但会在之后扩展为它,这将解决与命令的可选参数的混淆。

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{amssymb}
\makeatletter
\def\@lp{[}
\def\@rp{]}
\def\bbE{%
\@ifnextchar[%
{\@bbeWith}%
{\@bbeWithout}%
}
\def\@bbeWith[#1]{\mathbb{E}\left\@lp#1\right\@rp}
\def\@bbeWithout{\mathbb{E}\left\@lp X\right\@rp}

%or
%\renewcommand{\bbE}[1][X]{\mathbb{E}\left\@lp#1\right\@rp}
\makeatother


\begin{document}

Working:
$\bbE[XY]$

Broken:
$\bbE[\bbE[X]] \bbE[\bbE[Y]]$

\end{document}

答案2

您可以使用在这些情况下非常有用的功能xparse,而不需要进一步的技巧。

\documentclass{article}
\usepackage{amssymb}

\NewDocumentCommand{\expec}{O{X}}{\mathbb{E}[#1]}
%\newcommand{\bbE}[1][X]{\mathbb{E}\left[#1\right]}

\begin{document}

Working:
$\expec[XY]$

Working:
$\expec[\expec[X]]$ and $\expec[\expec[Y]]$

\end{document}

\usepackage{xparse}如果您没有运行最新的 LaTeX 发行版,则可能需要添加。

我使用了一个更具语义的名称,请随意使用您选择的名称。

在此处输入图片描述

相关内容