LaTeX:带有方括号的可选参数

LaTeX:带有方括号的可选参数

LaTeX 试图将我不想要的缺失 $ 添加到以下代码中。最小工作示例:

\documentclass[letter,12pt]{article}

\newcommand{\monkeyBeans}[2][]{
  \parbox{4in}{#1}
}

\begin{document}

\parbox{4in}{$[a, b]$} 

\monkeyBeans[$[a, b]$]{yo monkey}

\end{document}

如果我在文档中尝试以下任何一行而不是调用 monkeyBeans,则不会出现错误:

\parbox{4in}{$[a, b]$} 
\monkeyBeans[yo monkey]{$[a, b]$}
\monkeyBeans[$(a, b)$]{yo monkey}
\monkeyBeans{$[a, b]$}{yo monkey}

可选参数中的方括号有什么作用?

答案1

注意:如果没有 MWE,我将从\end{tabular}宏的定义中删除,并忽略您声明两个参数(一个可选,一个强制)但仅使用的事实#1

可选参数的行为与普通参数和组有很大不同,因为它被 TeX 借助[/]分隔符捕获。

使用宏定义

\newcommand{\monkeyBeans}[2][]{\parbox{4in}{#1}}

并调用

\monkeyBeans[$[a, b]$]{yo monkey}

#1将是$[a, b#2将是$,在这种情况下被丢弃,因为#2未在宏定义中使用。因此,\monkeyBeans[$[a, b]$]{yo monkey}扩展为

\parbox{4in}{$[a, b}]{yo monkey}

难怪有人失踪了$!我也会想念它的。

\monkeyBean使用定义为的宏

\newcommand{\monkeyBean}[1][]{\parbox{4in}{#1}}

并用于

\monkeyBean[$[a, b]$]yo monkey

发生的事情更加清楚,因为 TeX 两次遵守缺失,$因为该行扩展为

\parbox{4in}{$[a, b}$]yo monkey

并且“]yo monkey” 也是在数学模式下排版的。


解决方案:将可选参数括]在括号中,以便对它们进行分组:

\monkeyBean[{$[a, b]$}]
\monkeyBeans[{$[a, b]$}]{yo monkey}

答案2

Qrrbrbirlbel 的解决方案是标准的 LaTeX2e 方法,当然也是你对任意命令必须做的事情。LaTeX3 包xparse以更干净的方式处理嵌套:

\documentclass[letter,12pt]{article}
\usepackage{xparse}

\NewDocumentCommand{\monkeyBeans}{O{}m}{%
  \parbox{4in}{#1}%
}

\begin{document}

\parbox{4in}{$[a, b]$} 

\monkeyBeans[$[a, b]$]{yo monkey}

\end{document}

[]当然,只有当您定义需要嵌套的命令时它才有效。

相关内容