因此,我正在加载一个如下所示的 csv 文件:
est;dens;mwp
ols11;0.1;.
ols12;0.09;0.001
我想使用以下代码来除以两个数字。我在表格中使用 .csv,但我也在文本中引用它们,并希望此操作可以自动化。但是我从代码中得到以下错误:Missing number, treated as zero.
对于行\basiceval{\x/\y}
。我对在 LaTex 中评估数字不是很有经验,所以任何帮助都将不胜感激!
\documentclass{article}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{mun_reg}{63_mun_result.csv}
\def\basiceval#1{\the\numexpr#1\relax}
\begin{document}
\def\x{\DTLfetch{mun_reg}{est}{ols11}{dens}}
\def\y{\DTLfetch{mun_reg}{est}{ols12}{dens}}
\basiceval{\x/\y}
\end{document}
答案1
问题中的方法存在两个问题:首先\numexpr
执行整数除法,因此不能将其用于 0.1/0.09;其次,语句\DTLfetch
未在中展开\def
,因此您本质上是尝试将一个(非常复杂的)宏除以另一个宏,而不是像您期望的那样除以两个数字。
要对十进制数进行计算,datatool
有一些内置的数学函数,其中包括\DTLdiv
(用于除法)。这些函数的输入应该是一个保存值的宏,结果也存储在宏中。要将数据库值存储在宏中,您可以使用\DTLgetvalueforkey
而不是\DTLfetch
。请注意,\DTLgetvalueforkey
列和行规范的顺序是不同的(首先是要查找值的列,然后是参考列和行)。
有关数学函数的更多信息,您可以阅读手动的,特别是第 24 页及以后。
梅威瑟:
\documentclass{article}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{mun_reg}{63_mun_result.csv}
\begin{document}
\DTLgetvalueforkey{\myx}{dens}{mun_reg}{est}{ols11}
\DTLgetvalueforkey{\myy}{dens}{mun_reg}{est}{ols12}
\DTLdiv{\mydiv}{\myx}{\myy}
Result: \mydiv
\end{document}