我正在尝试使用FP 封装。我定义了一个宏来将数字添加到累计总数中,然后我定义了一个宏来输出最终值。
我遇到的问题是,根据调用该宏的位置,我会收到不同的输出。如果在表格内,我会收到正确的值,但如果在表格外,值就会翻倍。
有任何想法吗?
\documentclass[11pt]{report}
\usepackage{fp}
\usepackage{tabu,longtable}
\FPset\totalone{0}
\FPset\totaltwo{0}
\def\add#1{%
\FPadd\0\totalone{#1}
\global\let\totalone\0
\FPadd\0\totaltwo{#1}
\global\let\totaltwo\0
#1
}
\def\ptotalone{%
\totalone
\FPset\0{0}\global\let\totalone\0
}
\def\ptotaltwo{%
\totaltwo
\FPset\0{0}\global\let\totaltwo\0
}
\begin{document}
\begin{table}[htbp]
\begin{longtabu}{c}
\add{0.25} \\
\add{0.5} \\
\add{1} \\
total one: \ptotalone
\end{longtabu}
\end{table}
total two: \ptotaltwo
\end{document}
示例输出:
0.25
0.5
1
total one: 1.75
total two: 3.5
答案1
tabu
tabularx
在试运行期间继承了一些要禁用的代码,因此您只需在最终运行时在其具有正常值\write
时执行算术即可。\write
\documentclass[11pt]{report}
\usepackage{fp}
\usepackage{tabu,longtable}
\FPset\totalone{0}
\FPset\totaltwo{0}
\let\origwrite\write
\def\add#1{%
\relax\ifx\origwrite\write
\FPadd\0\totalone{#1}
\global\let\totalone\0
\FPadd\0\totaltwo{#1}
\global\let\totaltwo\0
\fi
#1
}
\def\ptotalone{%
\totalone
\FPset\0{0}\global\let\totalone\0
}
\def\ptotaltwo{%
\totaltwo
\FPset\0{0}\global\let\totaltwo\0
}
\begin{document}
\begin{table}[htbp]
\begin{longtabu}{c}
\add{0.25} \\
\add{0.5} \\
\add{1} \\
total one: \ptotalone
\end{longtabu}
\end{table}
total two: \ptotaltwo
\end{document}
答案2
环境tabu
(以及longtabu
) 对材料进行两次传递,因此您的操作将执行两次。不幸的是,似乎不存在仅在其中一次传递中设置的条件,以便仅进行一次寄存器设置或分配 (类似于\ifmeasuring@
) amsmath
。
因此答案似乎是:不要使用tabu
。请注意,正如作者所说,下一个版本tabu
的不是保证向后兼容性,所以我不建议使用它(作者回答我说,关于向后兼容性,“我不在乎”)。