我的 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}