宏内的下支撑问题

宏内的下支撑问题

我似乎无法将下括号放入宏中,但我不知道为什么。这是 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}

在此处输入图片描述

相关内容