我使用 datatool 包从 csv 文件中获取数据:
DTLgetvalueforkey{\thenames}{NAMES}{data}{BD}{#2}
\ifthenelse{\equal{\thenames}{\dtlnovalue}}{}{
\specialtext{\thenames}
}
基于拆分字符串并对每个段(或“单词”)应用操作我尝试将结果的每个“单词”写入\thenames
单独的行,如下所示:
\newcommand{\specialtext}[1]{%
\noexpandarg
\StrSubstitute{#1}{;}{\newline}[\myspecialtext]\textbf{\myspecialtext}}
但是我对该函数的调用并没有产生多行输出,而只产生了一行输出:\specialtext{\thenames}
但是我的测试调用:\specialtext{foo;bar}
完全按预期工作。
我的问题是我需要如何传递\thenames
才能\specialtext
使其与 for 一样工作foo;bar
?
编辑:这是我的MWE:
mwedata.csv的内容:
BD, NAMES
2606, foo bar; foo2 bar2
2706, foo3 bar3
mwe.tex:
\documentclass[a4paper]{article}
\usepackage{ifthen}
\usepackage{datatool}
\usepackage{xstring}
\DTLloaddb{data}{mwedata.csv}
\newcommand{\specialtext}[1]{%
\noexpandarg
\StrSubstitute{#1}{;}{\newline}[\myspecialtext]\textbf{\myspecialtext}
}
\newcommand*{\thenames}{}
\newcommand{\printSplittedNames}[2]{
\DTLgetvalueforkey{\thenames}{NAMES}{data}{BD}{#1}
\ifthenelse{\equal{\thenames}{\dtlnovalue}}{}{
\specialtext{\thenames}
%\thenames
%\specialtext{foo bar; foo2 bar2}
}
}
\begin{document}
2606:\\
\printSplittedNames{2606}\\
\newline
2706:\\
\printSplittedNames{2706}\\
\end{document}
我将其缩小到以下三行:
\specialtext{\thenames}
%\thenames
%\specialtext{foo bar; foo2 bar2}
我想要的是使用第一个,但结果打印在一行中。第二个只是打印了预期的一行作为 datatool 的返回值。在第三个中,datatool 返回的值被静态传递\specialtext
并按预期工作,但是我当然不希望该值是静态的,而是来自 mwedata.csv 值。
答案1
这是一个扩展问题:如果你\show\myspecialtext
在 之前添加\textbf
,你会看到扩展名为\thenames
。因此,你要使用\expandarg
,而不是\noexpandarg
。
宏\printSplitNames
应该只有一个参数,而不是两个。
\begin{filecontents*}{\jobname.csv}
BD, NAMES
2606, foo bar; foo2 bar2
2706, foo3 bar3
\end{filecontents*}
\documentclass[a4paper]{article}
\usepackage{ifthen}
\usepackage{datatool}
\usepackage{xstring}
\DTLloaddb{data}{\jobname.csv}
\newcommand{\specialtext}[1]{%
\saveexpandmode
\expandarg
\StrSubstitute{#1}{;}{\newline}[\myspecialtext]%
\restoreexpandmode
\textbf{\myspecialtext}%
}
\newcommand*{\thenames}{}
\newcommand{\printSplitNames}[1]{%
\DTLgetvalueforkey{\thenames}{NAMES}{data}{BD}{#1}
\ifthenelse{\equal{\thenames}{\dtlnovalue}}{}{\specialtext{\thenames}}%
}
\begin{document}
\noindent
2606:\\
\printSplitNames{2606}
\noindent
2706:\\
\printSplitNames{2706}
\end{document}