假设我们定义以下宏:
\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
有一个额外的解析层,确保[
和]
在可选参数内保持平衡)。