如何在参数中使用 pgf-math?

如何在参数中使用 pgf-math?

我回应 xport 的最近的 问题,我尝试执行以下操作

\usepackage{pgf}
[...]
\rule{\pgfmathdivide{4}{3}\pgfmathresult mm}{5mm}

不幸的是,此操作失败并显示以下错误消息:

! Missing number, treated as zero.
<to be read again> 
                   \begingroup 
l.11 ...pgfmathdivide{4}{3}\pgfmathresult mm}{5mm}

我的第一个猜测是,由于某种原因, 的输出\pgfmathresult不能用作 的输入\rule。然而,稍微重新排列

\pgfmathdivide{4}{3}\rule{\pgfmathresult mm}{5mm}

工作正常。为什么?我必须进行哪些更改才能将其放入\pgfmathdivide的参数中\rule(或者更确切地说,放入可以在的参数和类似命令中使用的宏中\rule)?

答案1

\pgfmathdivide根本无法扩展。我的意思是,它无法完全在 TeX 的扩展处理器中运行。

一个简单的例子是尝试分配给替换文本内的寄存器\edef

\edef\foo{\dimen0=3pt}
\show\foo

给出

> \foo=macro:
->\dimen 0=3pt.

请注意,实际上没有展开任何内容。这里适用相同的原则。\pgfmathdivide扩展到至少一个赋值(到\pgfmathresult),并且由于赋值不可扩展,因此\pgfmathdivide不能在扩展上下文中使用(至少不是您想要的方式)。

也许可以用一种可扩展的方式重新实现除法,例如使用ε-TeX 的表达式原语,但这可能是一项不小的工作量。

答案2

正如 TH 在他的回答中指出的那样,来自的宏pgfmath是不可扩展的。事实上,l3fp一年前我从头开始重写了这个包(好吧,我花了好几个月的时间),以提供许多其他包提供的可扩展版本。编写可扩展代码特别意味着无法将结果存储在变量中,当然这使得解析表达式或计算三角函数变得非常棘手。长话短说,我们现在可以可扩展地执行计算,因此以下工作有效。

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \eval \fp_eval:n
\ExplSyntaxOff
\begin{document}
  \rule{\eval{4/3}mm}{5mm}
\end{document}

首先使编程命令\fp_eval:n在文档级别可用,如\eval,然后在 的参数中使用它\rule。该\fp_eval:n命令接受一个参数,将其作为浮点表达式进行求值,并生成一个十进制数,因此扩展后的 的参数\rule1.333333333333333mm(16 位有效数字)。该l3fp包还提供其他函数,例如\fp_to_scientific:n,它将给出3.4e5或 之类的结果\fp_to_tl:n,它们会为非常大或非常小的数字生成科学表示,否则将生成十进制表示。 的另一个目标l3fp是遵循(十进制)IEEE 854(现已被 754 吸收)标准。一个主要的遗漏是缺乏对次正规数的支持。

相关内容