使用 \NewDocumentCommand 命令作为下标时出现“缺少 { 插入。”错误

使用 \NewDocumentCommand 命令作为下标时出现“缺少 { 插入。”错误

我想创建一个带有可选参数的自定义命令,该命令可以在数学模式下用作下标或上标。但是,以下代码:

\documentclass[pdftex,11pt]{report}

\usepackage{xparse}

\NewDocumentCommand{\MyCmd}{o}{\IfNoValueTF{#1}{X}{X_\mathrm{{#1}}}}

\begin{document}

$\MyCmd$

$Q_{\MyCmd}$

$Q_{\MyCmd[Y]}$

$Q_\MyCmd$  % <-- fails

$Q_\MyCmd[Y]$  % <-- fails

\end{document}

产生以下错误:
Missing { inserted. $Q_\MyCmd
Missing } inserted. $Q_\MyCmd$
Missing { inserted. $Q_\MyCmd
Missing } inserted. $Q_\MyCmd[Y]$

即,每当我想在子命令或上命令中使用它时,似乎都需要将命令调用包裹在括号中。

如何正确定义这样的命令,以便不需要插入额外的括号?

答案1

这是可能的定义命令,这样就不需要括号了,依靠低级细节来_扫描参数,这种方式与扫描宏参数完全不同,所以\bgroup在寻找可选参数之前只需要一个:

\documentclass[pdftex,11pt]{report}

\usepackage{xparse}

\NewDocumentCommand\MyCmd{}{\bgroup\MyCmdx}
\NewDocumentCommand{\MyCmdx}{o}{\IfNoValueTF{#1}{X}{X_\mathrm{#1}}\egroup}

\begin{document}

$\MyCmd$

$Q_{\MyCmd}$

$Q_{\MyCmd[Y]}$

$Q_\MyCmd$  % <-- fails

$Q_\MyCmd[Y]$  % <-- fails

\end{document}

_但是,如果与重新定义为采用正常参数的活动角色的众多包之一一起使用,则此操作将会失败。

X_\mathrm{b}或能正常X_\frac12工作是实现上的一个偶然,实际上它们不会给出错误只是语言的一个缺陷。记录的支持标记将是X_{\mathrm{b}}X_{\frac{1}{2}}

因此对错误的响应missing { inserted应该是添加缺失的部分{而不是重新编码宏这样就不会出现错误:-)

答案2

根据提供的链接芭芭拉·比顿

对我来说答案是:

没有办法避免使用括号。另一方面,在使用下标和上标时始终包含括号是一种很好的“编码”习惯(因为当出现问题时,它可以让我免于绞尽脑汁)。

相关内容