我一直在尝试获取由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}