俄罗斯套娃的可选参数

俄罗斯套娃的可选参数

为什么这不起作用。我怀疑是扩展问题……

\documentclass{standalone}

\newcommand{\foo}[1][foo]{#1}
\newcommand{\Fbox}[1][bla]{\fbox{#1}}

\begin{document}

\Fbox[\foo[bla]]

\end{document}

答案1

问题在于您的方括号有歧义。

当您编写\Fbox[\foo[bla]]宏时\Fbox,它认为它的(可选)参数是\foo[bla。然后\foo尝试使用参数执行,[bla因此它会抱怨,因为它的参数不符合预期的语法。

正如 egreg 所说,要解决这个问题你需要写下\Fbox[{\foo[bla]}]

正如符号在评论中所说,如果你使用\NewDocumentCommand来自xparse 包那么你的语法就合法了,因为 xparse 在匹配括号/分隔符方面稍微聪明一些。详细地说,这是有效的:

\documentclass{standalone}
\usepackage{xparse}
\NewDocumentCommand\foo{O{foo}}{#1}
\NewDocumentCommand\Fbox{O{bla}}{\fbox{#1}}

\begin{document}
    \Fbox[\foo[bla]]
\end{document}

xparse 包真的很酷。你可以用它定义带有许多可选参数的宏,顺序任意,可以带或不带默认值,可以带不同的分隔符,可以带星号,可以带铃铛......好吧,不是带铃铛,但它是我最喜欢的包之一:) 再举个愚蠢的例子,

\NewDocumentCommand\fock{D|>\lambda}{|#1\rangle}% optional argument between |...>

定义一个宏,默认情况下,它产生与 相同的|\lambda\rangle结果,其中可选参数为\fock|\mu>,扩展为|\mu\rangle。(当然,这应该始终在数学模式下使用。

相关内容