这是最简单的例子
\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 发行版,则可能需要添加。
我使用了一个更具语义的名称,请随意使用您选择的名称。