如何处理命令参数中的空值

如何处理命令参数中的空值

在此 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{}

相关内容