因此,我尝试导入整个报告中使用的大量值列表。但是,当我这样做时,结果始终为空白...
\documentclass{scrreprt}
\usepackage{csvsimple}
%
\csvloop{file={keyval.csv}, head to column names, command=%
\expandafter\newcommand\csname \Key
\endcsname{\Value}
}
%
\begin{document}
During test number TR-\testNumber{} a \vehicle{} was subject to etc....
\end{document}
文件夹中是 csv 文件;keyval.csv;
Key, Value
testNumber, 001
vehicle, Volkswagen Beetle
基本上结果是;
在测试编号 TR 期间,a 受到等...
答案1
您的问题是,您在此处定义了\testNumber
扩展为\Value
,而您希望它扩展为\Value
创建时的状态。这需要一个\edef
,或者最好是一个\protected@edef
\begin{filecontents*}{\jobname.csv}
Key, Value
testNumber, 001
vehicle, Volkswagen Beetle
\end{filecontents*}
\documentclass{scrreprt}
\usepackage{csvsimple}
\makeatletter
\csvloop{file={\jobname.csv}, head to column names, command=%
\expandafter\protected@edef\csname \Key
\endcsname{\Value}
}
\makeatother
\begin{document}
During test number TR-\testNumber{} a \vehicle{} was subject to etc....
\end{document}
原因是 TeX 是一种宏扩展语言。
\expandafter\newcommand\csname \Key
\endcsname{\Value}
被\Key
扩展(通过\csname
)以提供\testNumber
,但\Value
不是。另一方面,\edef
强制扩展替换文本。该\protectd@edef
版本对于由 LaTeX 宏组成的内容是安全的,例如,如果您在 CSV 文件中有任何格式。
答案2
您忘记扩展\Value
,只需添加几个\expandafter
标记即可轻松完成。我更喜欢将事物分开并将复杂的代码隐藏到宏中,而不是 的参数中\csvloop
。
\csname
这个想法是利用完全展开的事实,因此\expandafter
前面的\endcsname
展开,从而触发下一个的展开,最终展开(一次)\Value
。否则,您实际上会获得\newcommand\testNumber{\Value}
,因此当前的\Value
将会使用的含义,而不是定义时的含义。
然而,有一个小问题:\Value
必须扩大两次,因为的第一级扩展\Value
是\csvcolii
(单元格内容的内部表示)。没问题:使用三重\expandafter
序列。
\begin{filecontents*}{\jobname.csv}
Key, Value
testNumber, 001
vehicle, Volkswagen Beetle
\end{filecontents*}
\documentclass{scrreprt}
\usepackage{csvsimple}
\newcommand{\definekeytovalue}[2]{%
\expandafter\newcommand
\csname#1\expandafter\expandafter\expandafter\endcsname
\expandafter\expandafter\expandafter{#2}%
}
\csvloop{
file={\jobname.csv},
head to column names,
command=\definekeytovalue{\Key}{\Value}
}
\begin{document}
During test number TR-\testNumber{} a \vehicle{} was subject to etc....
\end{document}