除了语法之外,\dimen0= 和 \setlength{}{} 之间有什么区别?

除了语法之外,\dimen0= 和 \setlength{}{} 之间有什么区别?

我已经浏览了一段时间,试图找到上述问题的答案,并且找到了一些类似的问题以及它们的答案,所以我已经对如何回答我自己的问题有了模糊的想法。因此,我真的只是在寻求确认。

首先是一些类似的问题:

我目前的理解是:

\dimen0=value是一个 tex 原语,它的作用大致与以下 latex 命令组合相同,\newlength{\name}\setlength{\name}{value}其中数字标识符0满足用 选择的名称的用途\newlength

所以我第一个真正的问题是,这是否或多或少是正确的?我还有一个后续问题:什么时候使用某个命令的更基本版本是合适的?

我最近开始着手我的第一个 LaTeX 项目,它真的超越了单纯的使用。在我过去的使用中,Tex 和 LaTex 基本命令之间的区别根本就不存在。我越来越觉得我需要读一本真正的书才能比现在更进一步,所以对于最后一个后续问题,我想问你们中更有经验的人,我如何才能超越熟练用户对 TeX 的理解。

答案1

设置长度寄存器值的基本语法是

<register name> = <value>

其中<register name>是一个符号名称或\dimen后跟一个数字(通常为 8 位,etex加载包时为 15 位)。

内部寄存器只有一个符号名(例如\hsize)。LaTeX 或用户分配的长度寄存器都有这两个名称,但最好坚持使用符号名。当有人说

\newdimen\foo

TeX 执行一些计算,然后发出如下指令

\dimendef\foo=42

(数字会有所不同),因此\foo\dimen42将引用同一个寄存器。但用户不需要和不应该使用这个数字,因为它可能会根据启动时加载的包而改变。

相反,编号从 0 到 9 的寄存器是绝不分配,因此\dimen0(和其他的)可以用作临时计算的临时寄存器。

为什么我写成\newdimen而不是\newlength?因为\newlength实际上问题\newskip不是\newdimen。由 定义的长度寄存器\newlength总是橡胶长度。

这就解释了为什么使用\setlength是非常值得推荐的。说

\newlength{\foo}

进而

\foo=10pt 
Plus is a Latin word

会引发一个奇怪的错误:

! Missing number, treated as zero.
<to be read again> 
                   i
<*> Plus i
          s a Latin word

因为对橡胶长度寄存器的分配总是寻找关键字plusminus

\setlength{\foo}{10pt}%
Plus is a Latin word

这不会发生,因为它被翻译成

\foo=10pt\relax

LaTeX 内核还使用\dimen寄存器(用 分配\dimen),可以使用 来设置它们\setlength。专家(或货物崇拜者)程序员可能会决定使用原始语法来节省空间和宏扩展,但不建议新手这样做。坚持推荐的方式,你有时间学习如何安全地打破规则。

答案2

您的 LaTeX 语法不正确:LaTeX 等效项不是\setlength后者\newlength不采用值参数,它只是声明寄存器。

在未扩展的 LaTeX 中,\setlength\mylength{5pt}它几乎立即扩展,\mylength=5pt\relax因此实际上没有太大的区别,但是包和类应该始终使用接口\setlength,以便在calc加载包时,用户可以从该包加载的中缀表达式解析器中受益。

例如,\parbox内部使用\setlength\hsize{#1}而不是仅仅\hsize=#1\relax设置框中文本的宽度。因此,如果文档有

\usepackage{calc}

然后用户可以去

\parbox{\textwidth - 2cm}{...}

设置一个比文本宽度小 2cm 的框。如果使用中缀减法

\hsize=\textwidth - 2cm\relax

然后\hsize将被设置为\textwidth,并且“- 2cm”将作为文本排版在框的开始处。

相关内容