\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
命令接受一个参数,将其作为浮点表达式进行求值,并生成一个十进制数,因此扩展后的 的参数\rule
为1.333333333333333mm
(16 位有效数字)。该l3fp
包还提供其他函数,例如\fp_to_scientific:n
,它将给出3.4e5
或 之类的结果\fp_to_tl:n
,它们会为非常大或非常小的数字生成科学表示,否则将生成十进制表示。 的另一个目标l3fp
是遵循(十进制)IEEE 854(现已被 754 吸收)标准。一个主要的遗漏是缺乏对次正规数的支持。