计算环境内部的真实值

计算环境内部的真实值

我正在尝试在环境中计算实数。不幸的是,我必须在环境之外显示计算结果。

这是我最小的例子。

\documentclass{scrartcl}
\usepackage{fp}
\begin{document}
\FPset{\result}{0.0}
Result was globaly set to \result.
\FPset{\adda}{6.224}
\FPset{\addb}{5.113}
\begin{itemize}
\item Result \result
\item \FPadd{\result}{\result}{\addb} Result2: \result
\item \FPadd{\result}{\result}{\addb} Result3: \result
\item \FPadd{\result}{\result}{\addb} Result4: \result
\end{itemize}
The result afterwards: \result
(I'd expect 15.339 instead!)
\end{document}

有没有什么办法可以使用全局变量,而不是局部变量?

我已经尝试使用

\FPadd{\global\result}{\result}{\adda}

以不同的组合,但没有任何效果(除了错误消息)。

有人可以给我提示吗?

LuaTeX 解决方案也将受到欢迎。

提前致谢!

再见

答案1

既然您要求基于 LuaLaTeX 的解决方案……

我将您的目标解释为只想操作和显示一个变量。(如果不是这种情况,请告诉我。)代码设置了三个 LaTeX 宏,分别名为\inicalc\addtoshowcalc。它们通过调用\directlua来执行一些适当的 Lua 代码。请注意,的参数\addto可以是数字或宏,假定其计算结果为数字。(实际上没有对的参数执行任何输入健全性检查\addto。)

在此处输入图片描述

\documentclass{scrartcl} 
\newcommand\inicalc{ \directlua{x=0}}
\newcommand\addto[1]{\directlua{x=x+tonumber(#1)}}
\newcommand\showcalc{\directlua{tex.sprint(x)}}

\newcommand\adda{6.224}
\newcommand\addb{5.113}

\begin{document}
\inicalc
\noindent
The varialble is initialized globally to \showcalc. After adding \adda, we have \addto{\adda}\showcalc.
\begin{itemize}
\item \inicalc      Result0: \showcalc\ (Re-initialize the variable inside the itemize environment.)
\item \addto{\addb} Result1: \showcalc % argument is a LaTeX macro
\item \addto{\addb} Result2: \showcalc
\item \addto{5.113} Result3: \showcalc % argument is a numeric constant
\end{itemize}
The result after exiting from the list: \showcalc---as expected.
\end{document}

答案2

也许最简单的方法就是将值复制到全局变量中

\documentclass{scrartcl}
\usepackage{fp}
\begin{document}
\FPset{\result}{0.0}
Result was globally set to \result.
\FPset{\adda}{6.224}
\FPset{\addb}{5.113}
\begin{itemize}
\item Result \result
\item \FPadd{\result}{\result}{\addb} Result2: \result
\item \FPadd{\result}{\result}{\addb} Result3: \result
\item \FPadd{\result}{\result}{\addb} Result4: \result
\global\let\gresult\result
\end{itemize}
The result afterwards: \gresult % was \result before! edited by Jan
(I'd expect 15.339 instead!)
\end{document}

我可能会选择其中的某个命令expl3,它具有“set fp”命令的全局变体:

\documentclass{scrartcl}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \addtototal { m m }
  { \fp_gset:Nn #1 { #1 + #2 } }
\NewDocumentCommand \fpset { m m } { \fp_set:Nn #1 {#2} }
\NewDocumentCommand \fpprint m { \fp_use:N #1 }
\ExplSyntaxOff
\begin{document}
\fpset\result{0.0}
Result was set to \fpprint\result.
\fpset\adda{6.224}
\fpset\addb{5.113}
\begin{itemize}
\item Result \fpprint\result
\item \addtototal\result{\addb} Result2: \fpprint\result
\item \addtototal\result{\addb} Result3: \fpprint\result
\item \addtototal\result{\addb} Result4: \fpprint\result
\end{itemize}
The result afterwards: \fpprint\result
(I'd expect 15.339 instead!)
\end{document}

(在内部,这些不是可直接打印的值,因此需要一个访问器函数。)

相关内容