\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}
我很困惑。这是否意味着无法通过\dimexpr
in进行长度计算\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}