在表环境中使用 FP 包得到的奇怪结果

在表环境中使用 FP 包得到的奇怪结果

我正在尝试使用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

tabutabularx在试运行期间继承了一些要禁用的代码,因此您只需在最终运行时在其具有正常值\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不是保证向后兼容性,所以我不建议使用它(作者回答我说,关于向后兼容性,“我不在乎”)。

相关内容