检索 `\DTLfetch` 的子字符串

检索 `\DTLfetch` 的子字符串

我一直在尝试获取由datatool's, macro检索的值的子字符串\DTLfetch,但我无法控制此处的扩展。我尝试了一些\expandarg \fullexpandarg以及一些\edef

我不一定需要使用它datatool来检索内容或xstring执行子字符串命令,但我必须不更改数据文件。否则,我只会对其进行regex-ed。

输出

在此处输入图片描述

代码

\documentclass{article}

\usepackage{datatool}
\usepackage{xstring}

\usepackage{filecontents}

\begin{filecontents*}{data.csv}
x,y
duck,quack
donkey,hee-haw
\end{filecontents*}
\DTLloaddb{data}{data.csv}



\begin{document}

original value:
        \DTLfetch{data}{x}{donkey}{y}%

substring(failing):
% \fullexpandarg%
\expandarg%
\StrRight{%
        \DTLfetch{data}{x}{donkey}{y}%
        }{3}

Expecting output:
\StrRight{%
        hee-haw%
        }{3}

\end{document}

答案1

不幸的是,\DTLfetch是不可扩展的,但有一个办法:\DTLfetch将返回的值保存在中\dtlcurrentvalue,所以这只是一个制作的问题可供处理\StrRight且不打印任何内容。

我只是复制了 的定义\DTLfetch,将参数移动一位并插入到\let#1之前\dtlcurrentvalue(这会导致打印)。执行\DTLfetchsave{\temp}{<1>}{<2>}{<3>}{<4>},其中最后四个参数的含义与 的参数相同,\DTLfetch并且\temp是任何(未使用的)控制序列。您可以重复使用\temp或您选择的任何名称;请小心使用“奇怪的名称”。

\begin{filecontents*}{\jobname.csv}
x,y
duck,quack
donkey,hee-haw
\end{filecontents*}

\documentclass{article}

\usepackage{datatool}
\usepackage{xstring}

\newcommand{\DTLfetchsave}[5]{%
  \edtlgetrowforvalue{#2}{\dtlcolumnindex{#2}{#3}}{#4}%
  \dtlgetentryfromcurrentrow{\dtlcurrentvalue}{\dtlcolumnindex{#2}{#5}}%
  \let#1\dtlcurrentvalue
}

\DTLloaddb{data}{\jobname.csv}

\begin{document}

original value:
\DTLfetch{data}{x}{donkey}{y}%

substring:
\DTLfetchsave{\temp}{data}{x}{donkey}{y}%
\StrRight{\temp}{3}

Expecting output:
\StrRight{hee-haw}{3}

\end{document}

在此处输入图片描述

相关内容