LaTeX 似乎在处理嵌套可选参数时遇到了问题。我提供了一个生成错误的最小代码示例:
\documentclass[12pt,oneside]{book}
\begin{document}
\newcommand{\termbad}[2][]{#2#1}
\newcommand{\termgood}[2][]{#2#1}
\newcommand{\up}[1]{#1}
\newcommand{\dd}[1][]{#1}
\termgood{\up{Tart}}{Pop}
\termbad[\up{Tart}]{Pop}
\termgood{\dd[Tart]}{Pop}
\termbad[{\dd[Tart]}]{Pop}
%\termbad[\dd[Tart]]{Pop}
\end{document}
如果你运行此代码,它会起作用。如果你删除%
倒数第二行中的,它会失败并显示:
Runaway argument?
Tart{Pop} \par \par \end {document}
!File ended while scanning use of \dd.
经过进一步的修补,我发现了问题:LaTeX 将]
内部可选参数的 读取为外部可选参数的结尾,然后传入一个格式错误的参数。因此,它将 传入\dd[Tart
作为可选参数,\termbad
而不是\dd[Tart]
。
对我来说,这仍然感觉像是一个错误。在参数中嵌套括号是可行的,括号也应该可以。以下是解决方法:
将内部可选参数括在括号中(如之前的行所示
%
)。重新定义你的内部函数以需要其参数而不是使用可选参数。
重新定义外部函数以需要其参数而不是使用可选参数。
这三者中的任何一个都可以解决这个问题。
(在此处重新发布;问题最初发布到 stackexchange,然后被关闭而不是被迁移。)
答案1
当 TeX 读取参数时,TeX 仅检查花括号(字符代码为 1 和 2)是否匹配。方括号在这方面并不特殊。第一的 ]
未隐藏在花括号内的内容将被视为可选参数的结尾。因此,通常的解决方案是添加一组括号:
\foo[{\bar[...]}]{...}
如果这不起作用,那只是一个错误,例如,如果定义将可选参数传递给其他命令:
\def\foo#1#2{\bar[#1]{#2}}
这应该是
\def\foo#1#2{\bar[{#1}]{#2}}
然后#1
可能包含方括号,尤其是]
。