![使用可选字符定义命令](https://linux22.com/image/417251/%E4%BD%BF%E7%94%A8%E5%8F%AF%E9%80%89%E5%AD%97%E7%AC%A6%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4.png)
我有以下命令定义(在 MWE 中)
\documentclass{article}
\usepackage{amsmath}
\def\hE_#1^#2#3{\hat {\textrm{E}}_{#1}^{#2}\,[#3]}
\begin{document}
\[
\hE_{1}^{2}{3},\qquad
% \hE^{2}{3},\qquad
% \hE_{1}{3},\qquad.
% \hE^{2}_{1}{3},\qquad
% \hE{3}
\]
\end{document}
输出带有上标和下标的特定表达式。我想定义此命令的其他用法,以允许注释变体。我想我可以做到这一点
\def\hE^#1_#2#3{\hE_{#2}^{#1}{#3}}
\def\hE^#1#2{\hE_{}^{#1}{#2}}
\def\hE_#1#2{\hE_{#1}^{}{#2}}
但这给了我一个TeX capacity exceeded
错误。有办法吗?如果可能的话,我更喜欢使用内部 tex 定义而不是外部包。
答案1
您可以使用 来实现xparse
。e
参数类型采用标记列表,并在正文中#1
引用第一个标记后的项目、#2
第二个标记后的项目等等。您可以使用 测试它们是否存在\IfValueT
。
我不会添加\,
细空格。如果您愿意,请在以下代码中添加它。
\documentclass{article}
\usepackage{amsmath,xparse}
\NewDocumentCommand{\hE}{e{^_}m}{%
\mathop{}\!\hat{\mathrm{E}}%
\IfValueT{#1}{^{#1}}%
\IfValueT{#2}{_{#2}}%
[#3]%
}
\begin{document}
\[
\hE_{1}^{2}{3},\quad
\hE^{2}{3},\quad
\hE_{1}{3},\quad
\hE^{2}_{1}{3},\quad
\hE{3}
\]
\end{document}
与此比较的输出\,
:
我认为,很明显,狭窄的空间是不合适的,但你是最终的裁判。
另一方面,我只需做
\newcommand{\hE}{\mathop{}\!\hat{\mathrm{E}}}
并在括号中输入。
\hE_{1}^{2}[3],\quad
\hE^{2}[3],\quad
\hE_{1}[3],\quad
\hE^{2}_{1}[3],\quad
\hE[3]
如您所见,所提议的语法没有任何好处(除了可以插入细空格)。
更重要的是,\textrm{E}
是不是正确的工具;\mathrm{E}
是。
为什么\mathop{}\!
?因为这种方式\hE
被视为数学运算符,如\sin
或\log
。我选择不这样做\operatorname{\hat{E}}
,因为这样上标会太高。