为什么对于案例 A,我会得到“缺失数字,视为零”的错误,而其他案例却可以正常运行?如何避免这种情况?
\documentclass{report}
\begin{document}
\newlength\newLen
% Case A (error)
\setlength\newLen{\columnwidth-\tabcolsep-\doublerulesep-\arrayrulewidth}
% Case B (no error)
%\setlength\newLen{\columnwidth-\tabcolsep-\doublerulesep}
% Case C (no error)
%\setlength\newLen{\columnwidth-\tabcolsep-\arrayrulewidth}
% Case D (no error)
%\setlength\newLen{\columnwidth-\doublerulesep-\arrayrulewidth}
% Case E (no error)
%\setlength\newLen{\tabcolsep-\doublerulesep-\arrayrulewidth}
\end{document}
答案1
\setlength
定义为:
\def\setlength#1#2{#1 #2\relax}
因此它使用 TeX 的普通赋值\register1=\register2
,省略了可选=
符号。
扩展之后,您的代码将执行以下操作\setlength
:
\newLen \columnwidth-\tabcolsep-\doublerulesep-\arrayrulewidth
为了清楚起见添加了换行符,其含义与以下内容相同:
\newLen=\columnwidth
-
\tabcolsep=-\doublerulesep
-
\arrayrulewidth=\relax % error
最后的\arrayrulewidth
错误是因为那里被误用了,如果你看一下 PDF,你会看到两种-
排版。其他版本实际上不起作用:它们只是没有抛出错误,但排版仍然错误-
。它们没有错误,因为寄存器的数量是偶数,所以没有被误用。
正确的方法是告诉 TeX 这是一个维度表达式\dimexpr
:
\setlength\newLen{\dimexpr\columnwidth-\tabcolsep-\doublerulesep-\arrayrulewidth}
或者\usepackage{calc}
,正如 campa 在评论中所说,它重新定义了\setlength
理解表达式和一些其他\dimexpr
仅使用时不可用的好东西(请查看文档)。
顺便说一句,expl3
的等价物\dim_set:Nn
已经\dimexpr
对参数做了(尽管它没有添加语法calc
):
\ExplSyntaxOn
\dim_set:Nn \newLen {\columnwidth-\tabcolsep-\doublerulesep-\arrayrulewidth}
\ExplSyntaxOff