用于求和的 LaTeX 宏

用于求和的 LaTeX 宏

我有一个非常简单的 LaTeX 问题,它让我很困惑。我想编写一个宏来创建给定数字的累计总数。Ulrike Fischer 的答案这里几乎就是我想要的 - 简单而且没有额外的包。这是我有的:

\documentclass{article}

\usepackage{tabularx}

\newcommand\mySum{0}
\newcommand\clearSum{\renewcommand\mySum{0}}
\newcommand\addToSum[1]{\xdef\mySum{\fpeval{\mySum + #1}}}

\newcommand{\newNumber}[1]{
    \addToSum{#1}
    % Print number:
    #1 \\
}   
    
\newenvironment{RunningCount}
{
    % Open environment:
    \tabularx{\linewidth}{c}
}
{
    % Close environment:
    \endtabularx
}

\begin{document}
    \begin{RunningCount}
        \newNumber{0.435}
        \newNumber{0.764}
        Total: \mySum
    \end{RunningCount}
\end{document}

这会产生两倍的实际值。(有时似乎会产生其他倍数,但在上面这个简单的例子中,它始终是两倍)。

我可以通过添加来修复它

\begin{document}
    \clearSum
    ...

上述内容。但理想情况下我不想这样做。

这似乎是 tabularx 的一个问题 - 如果我从环境中删除 tabularx,它就可以正常工作。正如评论所说,tabularx 必须多次评估其内容(在本例中是两次),因为它会测量其内容并找到一个好的布局。我猜像 align 这样的环境也有类似的问题。

除了在文档开头放置 \clearSum 之外,还有其他方法可以解决这个多重评估问题吗?

答案1

您的示例c中有一列tabularx不应使用,问题就会解决。X您可以在 tx 重置 latex 计数器时重置宏。

在此处输入图片描述

\documentclass{article}

\usepackage{tabularx,etoolbox}
\makeatletter
\patchcmd\TX@trial\TX@ckpt{\TX@ckpt\clearSum}{}{}
\makeatother
\newcommand\mySum{0}
\newcommand\clearSum{\renewcommand\mySum{0}}
\newcommand\addToSum[1]{\xdef\mySum{\fpeval{\mySum + #1}}}

\newcommand{\newNumber}[1]{%%%%
    \addToSum{#1}%%%%
    % Print number:
    #1 \\%%
}   
    
\newenvironment{RunningCount}
{%%%%%
    % Open environment:
    \noindent\tabularx{\linewidth}{X}
}
{
    % Close environment:
    \endtabularx
}

\begin{document}
    \begin{RunningCount}
        \newNumber{0.435}
        \newNumber{0.764}
        Total: \mySum
    \end{RunningCount}
\end{document}

答案2

\clearSum我认为 David Carlisle 的答案可能更好,但这也许对处于类似困境的人也有用。经过一些实验,我通过在环境开头放置一个来让它工作,如下所示:

\documentclass{article}

\usepackage{tabularx}

\newcommand\mySum{0}
\newcommand\clearSum{\renewcommand\mySum{0}}
\newcommand\addToSum[1]{\xdef\mySum{\fpeval{\mySum + #1}}}

\newcommand{\newNumber}[2]{
    %% ORDER MATTERS:
    \addToSum{#2}
    % Print number:
    #1 & #2 \\
}   
    
\newenvironment{RunningCount}
{
    % Open environment:
    \tabularx{\linewidth}{X | r}

    %% ORDER MATTERS:
    Desc & Count \\
    \clearSum
}
{
    % Close environment:
    & Total: \mySum
    \endtabularx
}

\begin{document}
    \begin{RunningCount}
        \newNumber{First no:}{0.4}
        \newNumber{Second no:}{0.3}
        \newNumber{Third no:}{0.2}
        \newNumber{Fourth no:}{0.1}
    \end{RunningCount}
\end{document}

我标记的两个地方%% Order matters:是关键点,而有两个地方的事实使得这一点变得有点微妙。特别是,\clearSum 必须发生在环境打开的末尾,而不是像

\newenvironment{RunningCount}
    {
        % Open environment:
        \tabularx{\linewidth}{X | r}

        %% ORDER IS INCORRECT. Will behave strangely:
        \clearSum
        Desc & Count \\
    }
   {
       ...

而用下面的代码替换上述代码的相关部分也会产生错误的答案:

\newcommand{\newNumber}[2]{
        %% ORDER IS INCORRECT. Will behave strangely:
        % Print number:
        #1 & #2 \\
        \addToSum{#2}
    }

我认为这两者都与 tabularx 执行多重解析的方式有关。

相关内容