如何在函数调用中使用变量

如何在函数调用中使用变量

我使用 datatool 包从 csv 文件中获取数据:

DTLgetvalueforkey{\thenames}{NAMES}{data}{BD}{#2}
\ifthenelse{\equal{\thenames}{\dtlnovalue}}{}{
  \specialtext{\thenames}
}

基于datatool:根据另一列的值获取特定值

基于拆分字符串并对每个段(或“单词”)应用操作我尝试将结果的每个“单词”写入\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}

在此处输入图片描述

相关内容