我似乎无法将下括号放入宏中,但我不知道为什么。这是 MWE
\documentclass{standalone}
\usepackage{xstring}
\newcommand{\URD}[1]
{
\IfEq{#1}{}
{\textsc{urd}}
{\textsc{urd}\ensuremath{\left(#1\right)}}
}
\begin{document}
$\URD{K_{\underbrace{g,\ldots,g}_7}}$
\end{document}
返回错误:
! \@xs@arg@i 定义中的参数数量非法。
编译时。\URD 对于不包含下括号的简单表达式可以正常工作。
我是什么做的?
答案1
您应该使用\noexpandarg
或诸如\textsc
和 之类的脆弱命令\underbrace
将无法生存\IfEq
。
然而,还有更好的方法。对于这种情况,我建议使用可选参数,而不是强制参数。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\URD}{o}{%
\textnormal{\scshape urd}%
\IfValueT{#1}{(#1)}%
}
\begin{document}
$\URD$
$\URD[K_{\underbrace{g,\ldots,g}_7}]$
\end{document}
我会避免使用\ensuremath
和\left\right
。
这是一个扩展版本,因此您可以根据需要选择分隔符的大小。通过\URD*{...}
get\left
和\right
,最后一个例子说明了为什么默认使用它们是不好的。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\URD}{soo}{%
\textnormal{\scshape urd}%
\IfBooleanTF{#1}%
{\IfValueT{#2}{\left(#2\right)}}%
{\IfValueT{#2}{\IfValueTF{#3}%
{\mathopen{#2(}#3\mathclose{#2)}}%
{(#2)}%
}}%
}
\begin{document}
$\URD$
$\URD[K_{\underbrace{g,\ldots,g}_7}]$
$\URD[\big][K_{\underbrace{g,\ldots,g}_7}]$
$\URD*[K_{\underbrace{g,\ldots,g}_7}]$
\end{document}