带尺寸参数的宏

带尺寸参数的宏

我尝试过以下方法

\newdimen\fooDimen
\fooDimen=10.0pt
\newdimen\barDimen
\barDimen=20.0pt
 
\newcommand{\fooCommand}{2}{%
\ifdim#1 < #2
\typeout{Test}
\fi
}
 
\begin{document}
\fooCommand{\fooDimen}{\barDimen}
\end{document}

但我明白

! Missing number, treated as zero.
<to be read again>
                   ##
l.18 \ifdim#
            1 < #2

怎么了?提前谢谢您。

答案1

我添加\documentclass{article}并报告了带有行号的文件以供参考:

  1 \documentclass{article}
  2 \newdimen\fooDimen
  3 \fooDimen=10.0pt
  4 \newdimen\barDimen
  5 \barDimen=20.0pt
  6
  7 \newcommand{\fooCommand}{2}{%
  8 \ifdim#1 < #2
  9 \typeout{Test}
 10 \fi
 11 }
 12
 13 \begin{document}
 14 \fooCommand{\fooDimen}{\barDimen}
 15 \end{document}

如果我在这个文档上运行 LaTeX,我会得到

! Missing number, treated as zero.
<to be read again>
                   ##
l.8 \ifdim#
           1 < #2
?

因此您可以清楚地看到,不是调用\fooCommand触发了错误,而是在 TeX 检查第 8 行时发生了错误。

现在你应该知道,TeX 在定义新命令时不会对替换文本做任何解释,只是将其存储起来。然而,这里实际上正在处理预期的替换文本!

错误消息表明该#字符的位置不对:TeX 想要计算\ifdim,但它却找到了#(在错误消息中,它出现了两倍,表明有问题的标记的类别代码为 6)。这里没有进行参数替换,因为 TeX 是不是定义一个命令。

问题出在哪里?你对 使用了错误的语法\newcommand:参数的数量应该放在方括号中,而不是花括号中。所以你实际上做的是定义 代表\fooCommand2然后定义结束,TeX 开始处理随之而来的内容。

\newcommand{\fooCommand}[2]{%
  \ifdim#1 < #2
    \typeout{Test}%
  \fi
}

相关内容