维度还是宏观,哪个更好?

维度还是宏观,哪个更好?

在摆弄 TikZ/PGF 时,我经常发现自己想要存储一个长度以供以后使用。这里的“长度”是指非 TeX 含义的单词。由于我在 TikZ/PGF 中做事,所以我倾向于将其用于后续\pgfmath处理,所以这并不重要使用我是否将该长度存储为 TeX 长度或宏(假设我记得我已经做过了!)。

那么哪个是更好的选择?

我想到的是:每种类型的寄存器数量、查找速度、解析速度、代码的稳健性(我认为对于货物崇拜程序员比如我自己,\edef\savedlength{\oldlength}或者比当本身可能不是 TeX 长度时\let\savedlength=\oldlength更安全)。但我确信还有其他我没有想到的(作为一个谦虚的 CCP!)。\savedlength=\oldlength\oldlength

答案1

对于正常的 LaTeX 使用和少量的点或其他固定单位的长度,我建议使用维度寄存器(LaTeX:长度,TeX: \dimen)。它们的优点是速度更快,已经终止并且可以以因子作为前缀。缺点是您需要分配寄存器,并且必须小心不要在文本中单独使用它。

因为pgfmath比例因子的好处几乎完全消失,因为它允许您使用它*进行乘法。

宏的一个好处是它们可以保存特定于字体大小的长度emex单位。如果您将这些值分配给长度寄存器,则它们会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是宏还是维度。)

相关内容