我可以手动定义一个形式的宏\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}