此代码
\documentclass{article}
\usepackage[nomessages]{fp}
\begin{document}
\FPeval{result}{clip(cos(pi))}
$\cos(\pi)=$\result
\end{document}
将产生以下输出:
是否可以直接使用 fp 表达式的结果,而不需要预先计算它们并将其存储在永久变量中,以便我可以将代码转换为以下形式:
\documentclass{article}
\usepackage[nomessages]{fp}
\begin{document}
$\cos(\pi)=$<fp expression>
\end{document}
答案1
不确定这种方法是否存在任何问题。
\documentclass{article}
\usepackage[nomessages]{fp}
\newcommand\FPuse[1]{\FPeval{\result}{#1}{\result}}
\begin{document}
$\cos(\pi)=\FPuse{clip(cos(pi))}$\
$\sin(\pi/3)=\FPuse{sin(pi/3)}$
$\sin(\pi/3)=\FPuse{round(sin(pi/3),3)}$
\end{document}
在下面的评论中,jfbu 和我讨论了为什么我{\result}
在定义末尾分组\FPuse
。首先,让我们看看如果我取消分组会发生什么:
\newcommand\FPuse[1]{\FPeval{\result}{#1}\result}
第一次运算的结果是
我们看到的是,使用二进制减号将\result
自身设置为。结论是,在数学模式下,创建一个数量,它会导致后续的减号以二进制方式起作用。因此,消除此问题的唯一方法(不更改包)是将 final 隔离在其自己的组中,就像我在原始代码中所做的那样。{} - 1
\FPeval{}{}
\bgroup...\egroup
fp
\result
虽然 jfbu 对 进行了深入研究fp
,但我并不是专家,不知道是否fp
可以修改代码以\begingroup...\endgroup
改为使用(在数学模式下真正透明)。我确实知道fp
存在一些问题,例如,引入了一个杂散空间,\FPpow
必须\unskip
在使用后进行编辑。
有关小组问题的更多信息,请参阅下面的 jfbu 的评论。
答案2
不适用于fp
。但适用于 则有可能expl3
。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
% make an internal function available to the user
\cs_set_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff
\begin{document}
$\cos(\pi)=\fpeval{cos(pi)}$
$\sin(\pi/3)=\fpeval{sin(pi/3)}$
$\sin(\pi/3)=\fpeval{round(sin(pi/3),3)}$
\end{document}