我想使用布尔条件从 csv 文件中获取数据(要么给我水果,要么给我计数)。第一个命令(CMDone)运行正常,并显示“count”,获取也运行正常,并显示“34”。但是,当我将 \CMDone 放入获取中或 \CMDtwo 的获取中时,它会抛出 29 个错误并开始弄乱文档(见下文)。此外,\CMDone 给我的“count”带有一个额外的空格,而不是“count”。
\documentclass{article}
\usepackage{datatool}
\usepackage{ifthen}
\newboolean{IsAbbreviated}
\setboolean{IsAbbreviated}{false}
\begin{filecontents*}{fruitdatabase.csv}
fruit , count ,
strawberries, 34
bananas, 10
cherries, 11
apples, 4
\end{filecontents*}
\DTLloaddb{fruits}{fruitdatabase.csv}
\newcommand{\CMDone}{
\ifthenelse{\boolean{IsAbbreviated}}
{fruit}
{count}
}
\newcommand{\CMDtwo}[1]{
\DTLfetch{fruits}{fruit }{#1}{\CMDone}
}
\begin{document}
\CMDone; \\
\DTLfetch{fruits}{fruit }{strawberries}{count }; \\
\CMDtwo{strawberries};\\
\DTLfetch{fruits}{fruit }{strawberries}{\CMDone}; \\
\end{document}
答案1
所以,乌尔丽克·菲舍尔的评论有效:\ifthenelse 不可扩展且也已弃用,但如果用 etoolbox 的 \ifbool 替换它就可以工作。
\documentclass{article}
\usepackage{datatool}
\usepackage{etoolbox}
\newboolean{IsAbbreviated}
\setboolean{IsAbbreviated}{false}
\begin{filecontents*}{fruitdatabase.csv}
fruit, count,
strawberries, 34
bananas, 10
cherries, 11
apples, 4
\end{filecontents*}
\DTLloaddb{fruits}{fruitdatabase.csv}
\newcommand{\CMDone}{\ifbool{IsAbbreviated}{fruit}{count}}
\newcommand{\CMDtwo}[1]{\DTLfetch{fruits}{fruit}{#1}{\CMDone}}
\begin{document}
\CMDone; \\
\DTLfetch{fruits}{fruit}{strawberries}{count}; \\
\CMDtwo{strawberries};\\
\end{document}
此外,必须删除 \bool{},现在它只是定义的布尔名称“IsAbbreviated”,并且如果整个 \newcommand 写在一行中,则 count 后的多余空格就会消失。