根据Datatool内容定义宏

根据Datatool内容定义宏

我可以手动定义一个形式的宏\csname../dirX Color\endcsname并根据需要使用它。但是,我无法根据读取的内容执行相同的操作包裹datatool

MWE 如下:

在此处输入图片描述

最后一行(取消注释后)的期望输出是:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{datatool,xstring,xcolor}

\usepackage{filecontents}
\begin{filecontents*}{MyData.csv}
    Directory, Color
    ../dirB,    red
    ../dirC,    yellow
\end{filecontents*}

\begin{document}
\textbf{Without datatool:}
\expandafter\gdef\csname../dirA Color\endcsname{blue}%
\xdef\DirAColor{\csname../dirA Color\endcsname}
Color for '../dirA' is '\DirAColor': \textcolor{\DirAColor}{../dirA}.

\bigskip
\textbf{With datatool}
\DTLloadrawdb[keys={Directory,Color}]{MyDB}{MyData.csv}%

\DTLdisplaydb{MyDB}
\medskip
\DTLforeach{MyDB}{\Dir=Directory,\DirColor=Color}{%
    \edef\ExpandedDirColor{\DirColor}
    \expandafter\gdef\csname\Dir Color\endcsname{\ExpandedDirColor}%
}

\xdef\DirBColor{\csname../dirB Color\endcsname}

Color for '../dirB' is '\DirBColor':% \textcolor{\DirBColor}{../dirB}.
\end{document}

答案1

\csname是一种用于根据某些输入定义“动态”宏名称的有用构造,但是当您在不同的地方使用相同的基本结构时,您必须确保构造的宏名称真正匹配。

例如,比较一下

\expandafter\gdef\csname\Dir Color\endcsname{\ExpandedDirColor}%

接着就,随即

\xdef\DirBColor{\csname../dirB Color\endcsname}

请注意,第二个实际上在宏名称中包含一个空格字符,而在第一个构造中,明显的空格被“吃掉”作为宏名称的分隔符\Dir

为了使两个构造匹配,你应该使用

\csname\Dir\space Color\endcsname 

或者

\xdef\DirBColor{\csname../dirBColor\endcsname}

相关内容