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}
[]
当然,只有当您定义需要嵌套的命令时它才有效。