我有一个非常简单的 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 执行多重解析的方式有关。