newcommand 的可选参数

newcommand 的可选参数

假设我们定义以下宏:

\newcommand*{\G}[1][G]{\mathbb #1}
\newcommand*{\Cop}[1][]{\Delta_{#1}}

对于第一个,如果我们使用 $\G$,它会在 pdf 中产生 $\mathbb{G}$ 所产生的结果;如果我们使用 $\G[H]$,那么在这种情况下,它会产生 $\mathbb{H}$ 所产生的结果。现在,如果我们使用 $\Cop[\G]$,它会按预期产生 $\Delta_{\mathbb{G}}$。但问题是,每当我们使用 $\Cop[\G[H]]$ 来产生 $\Delta_{mathbb{H}}$ 的结果时,都会出现以下错误:

\\G 的参数有一个额外的 }

那里究竟出了什么问题?

答案1

可选参数与强制参数不太一样。它们以 开头[,并以 分隔到下一个](这很重要)。当你这样做

\Cop[\G[H]]
%   1  2 34

\Cop首先处理,其可选参数以第一个[(1) 开头,并由下一个 (3) 分隔,因此其参数是(1) 和(3)]之间的内容,即。用其定义替换为参数:[]\G[H\Cop

\Delta_{\G[H}]

你就可以看到哪里出了问题。

为了解决这个问题,要么“隐藏”括号中的内部参数:

\Cop[{\G[H]}]

或使用ltcmd定义命令:

\NewDocumentCommand \Cop { O{G} } {\mathbb{#1}}
\NewDocumentCommand \G { O{} } {\Delta_{#1}}

ltcmd有一个额外的解析层,确保[]在可选参数内保持平衡)。

相关内容