神秘的求和:当计算器的 \ADD 宏在表格中添加过多内容时

神秘的求和:当计算器的 \ADD 宏在表格中添加过多内容时

背景:在我的上一个问题罗伯特·富斯特教我如何使用定义全局变量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}

相关内容