直接评估 fp 表达式

直接评估 fp 表达式

此代码

\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...\egroupfp\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}

在此处输入图片描述

相关内容