我已经浏览了一段时间,试图找到上述问题的答案,并且找到了一些类似的问题以及它们的答案,所以我已经对如何回答我自己的问题有了模糊的想法。因此,我真的只是在寻求确认。
首先是一些类似的问题:
我目前的理解是:
\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
因为对橡胶长度寄存器的分配总是寻找关键字plus
和minus
。
\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”将作为文本排版在框的开始处。