在摆弄 TikZ/PGF 时,我经常发现自己想要存储一个长度以供以后使用。这里的“长度”是指非 TeX 含义的单词。由于我在 TikZ/PGF 中做事,所以我倾向于将其用于后续\pgfmath
处理,所以这并不重要使用我是否将该长度存储为 TeX 长度或宏(假设我记得我已经做过了!)。
那么哪个是更好的选择?
我想到的是:每种类型的寄存器数量、查找速度、解析速度、代码的稳健性(我认为对于货物崇拜程序员比如我自己,\edef\savedlength{\oldlength}
或者比当本身可能不是 TeX 长度时\let\savedlength=\oldlength
更安全)。但我确信还有其他我没有想到的(作为一个谦虚的 CCP!)。\savedlength=\oldlength
\oldlength
答案1
对于正常的 LaTeX 使用和少量的点或其他固定单位的长度,我建议使用维度寄存器(LaTeX:长度,TeX: \dimen
)。它们的优点是速度更快,已经终止并且可以以因子作为前缀。缺点是您需要分配寄存器,并且必须小心不要在文本中单独使用它。
因为pgfmath
比例因子的好处几乎完全消失,因为它允许您使用它*
进行乘法。
宏的一个好处是它们可以保存特定于字体大小的长度em
或ex
单位。如果您将这些值分配给长度寄存器,则它们会pt
在分配时而不是使用时转换为。
如果您主要使用pgfmath
表达式,并且需要多个长度(包括字体大小特定的长度),我会坚持使用宏。无论如何,您需要记住在几种情况下是处理长度寄存器还是宏,因此最好坚持一件事。\dimexpr
如果您需要尺寸表达式,这也会更简单一些。
使用 eTeX 还可以定义伪长度使用\dimexpr
。例如,您可以将\def\mylength{\dimexpr 1em\relax}
其视为长度寄存器,即您可以在其前面使用一个因子,并且可以(并且必须)使用它\the
来获取字符串表示形式。请注意pgfmath
通过检测其类型来处理长度寄存器,但无法处理\dimexpr
但是。因此\mylength
将首先展开,并且\dimexpr
将中断。要在pgfmath
表达式中使用它们,您需要首先使用将其转换为字符串\the
。这是阻止您将其用作现有代码的\pgfmathsetlength
直接替代品的一件事。\setlength
答案2
总体而言,我倾向于使用 TeX dimen 寄存器来存储固定长度。总体而言,TeX 解析这些寄存器的速度比解析宏中存储的等效数据的速度要快。这是因为就 TeX 而言,寄存器已正确“终止”:这在其他数据类型中比在固定长度中更常见。
你需要注意的是
\let\savedlength=\oldlength
是好的,当\oldlength
是一个宏,但当\oldlength
是一个dimen你复制的不是内容但指向寄存器的指针:
\newdimen\mydimena
\newdimen\mydimenb
\mydimena 10 pt
\let\mydimenb\mydimena
\mydimena 20 pt
\showthe\mydimenb
我会用类似的东西
\newdimen\savedlength
\savedlength\oldlength\relax
它将执行赋值操作,设置\savedlength
为 的值\oldlength
,并且无论是宏还是 dimen 都是安全的\oldlength
。如果 e-TeX 可用,我还会使用它\dimexpr
来避免留下任何\relax
多余的标记:
\savedlength\dimexpr\oldlength\relax
(这是有效的,因为\dimexpr
被它将要删除的终止\relax
。所以这里的\relax
将消失,留下一个,无论\oldlength
是宏还是维度。)