fp-如何保持变量中的运行总和?

fp-如何保持变量中的运行总和?

我的 LaTeX 中有以下代码:

\FPset{totalHours}{0}

\newcommand{\entry}[5]{
    \FPeval{totalHours}{(totalHours)+#5}
    #1 & #2 & #3 & #4 & #5 \\
}

其中\entry是时间日志中的一个条目。第 5 个参数是一个数字,表示该条目中的小时数。我想将小时数的累计总数保存在一个变量中,以便以后打印totalHours

这似乎可以做到,\FPeval但下次我写入时totalHours会重置为。保持累计总数的正确方法是什么?谢谢。0\entry

答案1

\entry您似乎在 中设置了tabular;单元格内的命令定义范围tabular仅限于该单元格,因为它形成了一个组。而且,由于fp评估本质上是宏定义,设置行后所有计算都会丢失。

解决这个问题的一种方法是通过以下方式在评估后使定义全局化

\xdef\totalHours{\totalHours}

这是一个完整的例子:

在此处输入图片描述

\documentclass{article}

\usepackage[nomessages]{fp}

\newcommand{\entry}[5]{%
  \FPeval{totalHours}{totalHours+#5}% Add to totalHours
  \xdef\totalHours{\totalHours}% Make definition \global
  #1 & #2 & #3 & #4 & #5 \\% Set entry
}

\begin{document}

\FPset{totalHours}{0}

\begin{tabular}{ *{5}{r} }
  1 & 2 & 3 & 4 & totalHours \\
  \hline
  \entry{A}{B}{C}{D}{1.1}
  \entry{A}{B}{C}{D}{2.2}
  \entry{A}{B}{C}{D}{3.3}
  \entry{A}{B}{C}{D}{4.4}
  \entry{A}{B}{C}{D}{5.5}
\end{tabular}

Total hours: \FPround{\totalHours}{\totalHours}{1}\totalHours

\end{document}

答案2

如今,有更好的方法。

我建议使用expl3一些功能,这样也可以避免破坏命令的风险。

服用沃纳的回答作为基础:

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\zerofpvar}{m}
 {
  \fp_zero_new:c { g_egreg_#1_fp }
 }
\NewExpandableDocumentCommand{\usefpvar}{m}
 {
  \fp_use:c { g_egreg_#1_fp }
 }
\NewDocumentCommand{\updatefpvar}{mm}
 {
  \fp_gset:cn { g_egreg_#1_fp } { #2 }
 }
\ExplSyntaxOff

\newcommand{\entry}[5]{%
  \updatefpvar{totalHours}{\usefpvar{totalHours}+#5}% Add to totalHours
  #1 & #2 & #3 & #4 & #5 \\% Set entry
}

\begin{document}

\zerofpvar{totalHours}

\begin{tabular}{ *{5}{r} }
  1 & 2 & 3 & 4 & totalHours \\
  \hline
  \entry{A}{B}{C}{D}{1.1}
  \entry{A}{B}{C}{D}{2.2}
  \entry{A}{B}{C}{D}{3.3}
  \entry{A}{B}{C}{D}{4.4}
  \entry{A}{B}{C}{D}{5.5}
\end{tabular}

Total hours: \usefpvar{totalHours}

\end{document}

在此处输入图片描述

相关内容