![使用嵌套命令的分隔符错误](https://linux22.com/image/441711/%E4%BD%BF%E7%94%A8%E5%B5%8C%E5%A5%97%E5%91%BD%E4%BB%A4%E7%9A%84%E5%88%86%E9%9A%94%E7%AC%A6%E9%94%99%E8%AF%AF.png)
我不是 TeX 专家,但我遇到了一个问题。我已将其浓缩为以下最小工作示例(或者说不工作示例):
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\newcommand{\E}{
\@ifnextchar[{\Ea}{\mathbb{E}}
}
\newcommand{\Ea}[1][]{
\@ifnextchar\bgroup{\Eb{#1}}{\mathbb{E}\left[#1\right]}
}
\newcommand{\Eb}[2]{
\mathbb{E}\left[#1\,\middle|\, #2\right]
}
\makeatother
\begin{document}
\begin{equation}
\E[\E[X]{Y}]{Y}=\E[X]{Y}
\end{equation*}
\end{document}
我希望此命令\E
可以用作\mathbb{E}
。我希望第一个可选参数放在方括号中,第二个(更可选)参数放在花括号中。我不太明白,为什么上面的例子不起作用。我收到错误“缺少分隔符(插入 .)。”输出如下所示:E[E[X|Y]]Y=E[X|Y] 它应该看起来像这样 E[E[X|Y]|Y]=E[X|Y] 我在传递时也遇到了一些问题
\E[X_{n+1}]{X_1,\dots,X_n}
我可以确定\dots
问题出在哪里。这个问题可以通过以下方式修复(为什么,我不太明白)
\newcommand{\Eb}[2]{
\mathbb{E}\left[\nonexpanded{#1\,\middle|\, #2\right}]
}
但是,这也不能解决嵌套问题。我现在完全不知道发生了什么。有什么方法可以解决这个问题吗?
答案1
不要使用可选的{
...}
分隔参数。这些是丑陋的!
但如果你必须...
将内部参数括在括号中:
\begin{equation}
\E[{\E[X]{Y}}]{Y}=\E[X]{Y}
% ^ ^
\end{equation*}
或使用xparse
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xparse}
\NewDocumentCommand \E { o !g }
{%
\IfValueTF{#1}%
{%
\mathbb{E}\left[#1%
\IfValueT{#2}{\,\middle|\,#2}%
\right]%
}%
{\mathbb{E}\IfValueT{#2}{{#2}}}%
}
\begin{document}
\begin{equation}
\E[\E[X]{Y}]{Y}=\E[X]{Y}
\end{equation}
\begin{equation}
\E[\E[X]]=\E[X]
\end{equation}
\begin{equation}
\E\E{Y}=\E[X]
\end{equation}
\end{document}