错误?LaTeX 错误解析嵌套的可选参数

错误?LaTeX 错误解析嵌套的可选参数

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可能包含方括号,尤其是]

相关内容