为什么这不起作用。我怀疑是扩展问题……
\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
。(当然,这应该始终在数学模式下使用。