minipage
支持可选参数的空值:
\begin{minipage}[c][][c]{1cm} test \end{minipage}
或者
\begin{minipage}[c][\relax][c]{1cm} test \end{minipage}
但如果空值是通过宏传递的,则不会:
\def\param{}
\begin{minipage}[c][\param][c]{1cm} test \end{minipage}
或者
\def\param{\relax}
\begin{minipage}[c][\param][c]{1cm} test \end{minipage}
我如何正确定义宏,以便 minipage 取空值?
答案1
的内部代码minipage
在处理时使用可选参数\endminipage
。在某个时刻,\@iiiparbox
被调用,它执行\ifx\relax#2
,其中#2
是第二个可选参数(或者\relax
如果可选参数为空)。由于没有执行任何扩展\ifx
,您的代码比较
\ifx\relax\param
返回 false,因为\param
是一个扩展为的宏\relax
,不同于\relax
(假设您给出了)\def\param{\relax}
;或者它扩展为无,这又不同于在给出时参数被吸收时为空\def\param{}
。
顺便说一句,\def\param\relax
这是不正确的语法;在第二个示例中的两行中,您\param
使用参数文本进行定义\relax\begin
,并将其扩展为minipage
。但\def\param{\relax}
正如所解释的那样,预期的结果(我在答案中假设)将不起作用。