使用 \dimexpr 计算 \newlength 中的长度

使用 \dimexpr 计算 \newlength 中的长度
\documentclass[a4paper]{article}
\usepackage{geometry}
\geometry{showframe}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\begin{document}
(1)

    \newlength{\ccc}{\dimexpr\textwidth-100pt}

% This cause error message: You can't use `\dimexpr' in vertical mode.Why is \dimexpr used here a wrong way?

(2)

    \newdimen\ddd{\dimexpr\textwidth-100pt}

% This also causes error.

(3)

        \def\aaa{\dimexpr\textwidth-100pt}
    
    \rule{\aaa}{10pt}

% This does work.
\end{document}

我很困惑。这是否意味着无法通过\dimexprin进行长度计算\newlength

答案1

您的示例 (2):\newdimen只有一个参数,它声明了一个新的“dimen”变量并将其设置为 0pt。它只有一个参数(\ddd在您的示例中)。以下{\dimexpr ...}打开一个组{\dimexpr以垂直模式查看。TeX 不允许\dimexpr在此上下文中使用。您可以使用\the\dimexpr...打印值,但不能\dimexpr单独打印。TeX 报告错误。

您的示例 (3):您定义宏 (无变量)\aaa并将其扩展为。您在扩展为 的\dimexpr...上下文中使用此宏。现在在允许的上下文中使用。\hrule height\aaa\hrule height\dimexpr...\dimexpr

答案2

如果你试试

\documentclass{article}
\begin{document}

\newlength{\ccc}{10pt}

\the\ccc

\end{document}

你得到

在此处输入图片描述

你能明白为什么吗?因为\newlength需要参数,不是两个,所以{10pt}是排版。接下来显示的值\ccc,仍然是0pt

如果你

\newlength{\ccc}{\dimexpr\textwidht-100pt}

然后 TeX 尝试排版{\dimexpr\textwidth-100pt},这会引发有关 的错误\dimexpr,这在该上下文中是不合法的。

那里理由。一般来说,寄存器应该在前导码中分配,并且可以在任何需要的地方设置它们的值。

您首先分配寄存器,然后设置它。新长度寄存器的分配通过 完成\newlength;长度寄存器的设置通过 完成\setlength

\documentclass{article}
\newlength{\ccc}

\begin{document}

\setlength{\ccc}{\dimexpr\textwidth-100pt}

\rule{\ccc}{10pt}

\end{document}

顺便说一句,如果您想用 4pt 粗线填充线条的其余部分,还有一种不需要测量的不同方法。

\documentclass{article}

\newcommand{\filltoend}{%
  \unskip\nobreak\leaders\hrule height4pt\hfill\mbox{}\par
}

\begin{document}

Some words\filltoend

Some words and some other words
Some words and some other words
Some words and some other words
Some words and some other words
Some words and some other words\filltoend

Some words and some other words
Some words and some other words
Some words and some other words
Some words and some other words
Some words\filltoend

\end{document}

在此处输入图片描述

相关内容