鉴于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
三个参数,第一个是接收结果的宏,后两个是要添加的数字。您可以使用任意组合。