新命令扩展为空白

新命令扩展为空白

因此,我尝试导入整个报告中使用的大量值列表。但是,当我这样做时,结果始终为空白...

\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}

在此处输入图片描述

相关内容