在此 MWE 中,命令参数直接传递给环境。这在空值的情况下工作正常:
\documentclass{article}
\newcommand{\minipag}[1]{%
\begin{minipage}[b][#1][b]{6em}
One minipage
\end{minipage}
}
\begin{document}
\minipag{2em}
\minipag{\relax}
\minipag{}
\end{document}
但是,当使用宏传递参数并且它采用空值时,(minipage)环境无法识别它:
\documentclass{article}
\newcommand{\minipag}[1]{%
\def\upto{#1}
\begin{minipage}[b][\upto][b]{6em}
One minipage
\end{minipage}
}
\begin{document}
\minipag{2em}
\minipag{\relax}
\minipag{}
\end{document}
为什么会发生这种情况? 有什么办法可以解决?
对我来说,根本问题是细绳参数实际上是:宏、标记列表、一般文本、寄存器......
答案1
这里没有一般的功能,您只是看到小页面缺少错误检查。
在
\begin{minipage}[b][...][b]{6em}
这...
是一个长度因此空参数是语法错误。不幸的是minipage
(因为在 1993 年添加此参数时空间紧张),它没有进行任何真正的错误检查,空参数偷偷溜了过去,最后以
\ifx \relax #2\else \setlength \@tempdimb {#2}
因此,该\ifx
测试是一个(过于简单的)测试,用于查看是否使用了该参数;并且当#2
为空时,它不会进行测试#2
,\relax
而是\relax
进行\else
无意义的测试,幸运的是,它避免了具有空长度的 setlength,从而避免了错误。
当#2
(任何)命令名除\relax
预期的测试之外时,测试为假,因此长度设置为扩展,#2
在这种情况下为空,所以你会得到一个错误,与
\setlegth\@tempdima{}