背景:在我的上一个问题,罗伯特·富斯特教我如何使用定义全局变量calculator
包裹。
我想定义一个也适用于非整数的“计数器”。因此,我定义了一个\addtocounter
类似宏,如下所示(假设\mySum
和\whatIAdd
之前已经定义过):
\ADD{\whatIAdd}{\mySum}{\mySum}
\GLOBALCOPY{\mySum}{\mySum}
我的宏在普通文本模式下运行良好(见下文)。但是,如果我在表格中使用它,它会“神秘地”在绘制表格之前执行一次加法。即使我在开始时重置它,它也会等于表格中\mySum
每个加法的总和。\whatIAdd
问题:这个伪影从何而来,又该如何去除它?
\documentclass{scrartcl}
\usepackage{calculator}
\usepackage{array,tabulary,booktabs}
%% Macro definition %%
\newenvironment{mytable}
{
\GLOBALCOPY{0}{\mySum}
\texttt{mySum} equal \mySum
\tabulary{\linewidth}{CC}
\toprule
\textbf{A}&\textbf{$\Sigma$ A}\\
\midrule
}{
\endtabulary
}
\newcommand{\makeline}[1]
{%
\COPY{#1}{\whatIAdd}
\ADD{\whatIAdd}{\mySum}{\mySum}
\GLOBALCOPY{\mySum}{\mySum}
%
\whatIAdd & \mySum\\
}
\newcommand{\resetMySum}{\GLOBALCOPY{0}{\mySum}\noindent I've reseted \texttt{mySum}. It's value is now \mySum .\newline}
\newcommand{\addMySum}[1]
{
\COPY{#1}{\whatIAdd}
\ADD{\whatIAdd}{\mySum}{\mySum}
\GLOBALCOPY{\mySum}{\mySum}
%
\noindent I added \whatIAdd{} to \texttt{mySum}. It's value is now \mySum .\newline
}
\begin{document}
\begin{minipage}{.25\textwidth}
\begin{mytable}
\makeline{0}
\makeline{1}
\makeline{42}
\bottomrule
\end{mytable}
\end{minipage}
\begin{minipage}{.75\textwidth}
\resetMySum
\addMySum{0}
\addMySum{1}
\addMySum{42}
\end{minipage}
\end{document}
答案1
这是 tabulary 包的副作用。
在此包中,表格被评估两次,以确保列的宽度正确。在您的示例中,总数增加了 43(第一次评估中包含的最后一个值!)。
修改代码以确保第二次计算时 \mySum 为零:
\begin{document}
\begin{minipage}{.25\textwidth}
\begin{mytable}
\makeline{0}
\makeline{1}
\makeline{42}
\bottomrule
\GLOBALCOPY{0}{\mySum} %%%% Reset \mySum to zero
\end{mytable}
\end{minipage}
\end{document}