\pgfmathsetlengthmacro
我通过from制作一个长度宏tikz
来绘制这样的规则:
\pgfmathsetlengthmacro{\bvar}{\textwidth - 5cm}
\rule{\bvar}{5mm}
它正如预期的那样运行良好。
然后我想显示长度值\the\bvar
但是失败了。
\bvar 是长度宏,为什么 \the\bvar 不起作用?我该如何获取它?
答案1
命令名称中有一个线索。这是\pgfsetlengthmacro
from的定义pgfmathcalc.code.tex
:
\def\pgfmathsetlengthmacro#1#2{%
\begingroup%
\pgfmathsetlength\pgfmath@x{#2}% ❶
\edef#1{\the\pgfmath@x}% ❷
\pgfmath@smuggleone{#1}% ❸
\endgroup%
}
这里发生的事情是,首先❶我们\dimen
用计算出的值设置一个。然后❷使用\edef
和将值存储在宏中\the\pgfmath@x
。所以如果的值为\pgfmath@x
,那么47pt
宏将扩展为47pt
。最后❸通过一些我不会在这里讲的技巧,定义的值可以存在于组之外。请注意,通过将所有代码放在一个组中,代码避免覆盖内部使用的,而这些可能用于其他地方的其他计算(尽管这是在中\dimen
唯一的用途)。\dimen
pgfmathcalc.code.tex
现在至于为什么发生这种情况时,有两件事值得注意。一是实际上没有\dimen
宏。事实上,只有 255\dimen
寄存器可用于 TeX/LaTeX¹。因此,我们不能仅仅将\dimen
s 视为变量,因为它们是一种非常有限的资源。事实上,在不加载任何包的情况下,LaTeX 内核已经获取了其中的 138 个。通过将值存储在宏而不是寄存器中\dimen
,可以避免不必要地耗尽此资源。
正如您所注意到的,生成的宏似乎与 的行为相同,\dimen
尽管存在一些关键差异,最明显的是您可以编写例如,0.5\somedimen
并得到 中一半的值的结果\somedimen
。使用宏执行此操作将扩展为 0.547.0pt,这将导致错误。
因为它是一个宏,所以你只需\bvar
在想要获取值的地方键入即可,无论是在文本中排版还是用 输出到控制台\typeout
。
- LaTeX 将
\dimen
s 重命名为,lengths
但它们是同一件事。\newlength{\foo}
并且\newdimen\foo
最终每个都有相同的效果,尽管 LaTeX 版本的命令包含保护,以确保您不会无意中覆盖现有命令。