\newcommand 的返回类型可能不适合 \DTLfetch?

\newcommand 的返回类型可能不适合 \DTLfetch?

我想使用布尔条件从 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 后的多余空格就会消失。

相关内容