如何显示由 \pgfmathsetlengthmacro 制作的长度宏的长度值

如何显示由 \pgfmathsetlengthmacro 制作的长度宏的长度值

\pgfmathsetlengthmacro我通过from制作一个长度宏tikz来绘制这样的规则:

\pgfmathsetlengthmacro{\bvar}{\textwidth - 5cm} 
\rule{\bvar}{5mm}

它正如预期的那样运行良好。

然后我想显示长度值\the\bvar但是失败了。

\bvar 是长度宏,为什么 \the\bvar 不起作用?我该如何获取它?

答案1

命令名称中有一个线索。这是\pgfsetlengthmacrofrom的定义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唯一的用途)。\dimenpgfmathcalc.code.tex

现在至于为什么发生这种情况时,有两件事值得注意。一是实际上没有\dimen宏。事实上,只有 255\dimen 寄存器可用于 TeX/LaTeX¹。因此,我们不能仅仅将\dimens 视为变量,因为它们是一种非常有限的资源。事实上,在不加载任何包的情况下,LaTeX 内核已经获取了其中的 138 个。通过将值存储在宏而不是寄存器中\dimen,可以避免不必要地耗尽此资源。

正如您所注意到的,生成的宏似乎与 的行为相同,\dimen尽管存在一些关键差异,最明显的是您可以编写例如,0.5\somedimen并得到 中一半的值的结果\somedimen。使用宏执行此操作将扩展为 0.547.0pt,这将导致错误。

因为它是一个宏,所以你只需\bvar在想要获取值的地方键入即可,无论是在文本中排版还是用 输出到控制台\typeout


  1. LaTeX 将\dimens 重命名为,lengths但它们是同一件事。\newlength{\foo}并且\newdimen\foo最终每个都有相同的效果,尽管 LaTeX 版本的命令包含保护,以确保您不会无意中覆盖现有命令。

相关内容