在 `\DTLforeach` 中使用数据工具的 `\DTLaddall` 时出现奇怪的错误

在 `\DTLforeach` 中使用数据工具的 `\DTLaddall` 时出现奇怪的错误

鉴于test.csv包含:

捐助者、核心、非核心
挪威,137.6,111.4
荷兰,116.6,85.8

data-problem.tex包含:

\documentclass{article}
\usepackage{datatool}
\begin{document}

\DTLloaddb{contrib}{test.csv}

% add "total" column
%\tracingmacros=1
\DTLforeach{contrib}{\contribC=core,\contribNC=non-core}{%
\DTLaddall{\contribT}{\contribC,\contribNC}}

\end{document}

我收到错误:

(e:\Documents\Anthropology\Paper\data-problem.aux)(FP-EQ?)(FP-ADD)
失控的争论?
\relax \fi \ifnum \@dtl@tmpcount  
                   \par
l.11

[1](e:\Documents\Anthropology\Paper\data-problem.aux))
(第 10 行的 \ifx 不完整时出现 \end)
(第 10 行的 \iftrue 不完整时发生 \end)
(第 10 行的 \ifnum 不完整时出现 \end)
(第 10 行的 \ifnum 不完整时出现 \end)
(第 10 行的 \ifnum 不完整时出现 \end)
(更多信息请参阅记录文件)
输出写在 data-problem.dvi (1 页,216 字节) 上。
SyncTeX 写在 data-problem.synctex.gz 上
记录在 data-problem.log 上。

LaTeX 于 12 月 16 日星期四 15:33:33 异常退出,代码为 1

但是,在 中不会发生这种情况\DTLadd{\contribT}{\contribC}{\contribNC},在以下情况下也不会发生这种情况:

\def\foo{1.2}
\def\bar{3.4}
\DTLaddall{\baz}{\foo,\bar}

所以我有点不知道这里出了什么问题......

答案1

Datatool 并不总是能完美地运行。

简而言之,您的示例应该可以工作,但我的猜测是,\DTLaddall\DTLgaddall不喜欢\DTLforeach循环或 datatool 包生成这些数字的方式。如果您使用带有数字的其他宏,它似乎可以工作。无论我做什么,我都无法让 datatool 接受由数据库生成的数字。

我知道这不是答案,但我会给你三件节日礼物:

1) 我以前被 datatool 搞得焦头烂额。它根本就不是没有 bug 的,所以从我的角度来看,它很可能是个 bug。

2) pgf 的 foreach 和 math 函数可以非常轻松地完成您想要的操作,您可以考虑这些函数。您可以使用 datatool 获取 csv 数据,然后使用 pgf 遍历它。如果您愿意,我可以发布一个例子。

3)我想您已经知道这一点,但您可以通过执行以下操作来完成数据库中所有内容的总计:

\documentclass{article}
\usepackage{datatool}

\begin{document}
\def\mynum{0}
\DTLloaddb{contrib}{test.csv}

% add "total" column
%\tracingmacros=1
\DTLforeach{contrib}{\contribD=donor,\contribC=core,\contribNC=noncore}{%
\DTLgadd{\mynum}{\contribNC}{\mynum}
\DTLgadd{\mynum}{\contribC}{\mynum}
%
}

\mynum
\end{document}

希望这能有所帮助。如果没有帮助,请告诉我。再次重申,我明白我没有回答你的问题(除了我认为 datatool 有问题),但希望我解决了你的问题。

另外,顺便说一句,作者确实制作了补丁,当我要求她修复时,她确实帮我修复了。

答案2

datatool似乎与包的结合存在冲突fp。您可以尝试fp直接使用该包(它由 datatool 自动加载)。这有效。

\documentclass{article}
\usepackage{datatool}
\begin{document}

\DTLloaddb{contrib}{test.csv}

% add "total" column
%\tracingmacros=1

\DTLforeach{contrib}{\contribC=core,\contribNC=non-core}{%
 \def\a{\contribC}
 \def\b{\contribNC}
 \FPadd{\result}{\a}{\b}
\noindent\result\\
}
\end{document}

需要\FPadd三个参数,第一个是接收结果的宏,后两个是要添加的数字。您可以使用任意组合。

相关内容