Latex 长计算错误:“缺失数字,视为零”

Latex 长计算错误:“缺失数字,视为零”

为什么对于案例 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

相关内容