我想创建一个带有可选参数的自定义命令,该命令可以在数学模式下用作下标或上标。但是,以下代码:
\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
根据提供的链接芭芭拉·比顿:
对我来说答案是:
没有办法避免使用括号。另一方面,在使用下标和上标时始终包含括号是一种很好的“编码”习惯(因为当出现问题时,它可以让我免于绞尽脑汁)。