DTLgetvalueforkey 有效,但 DTLfetch 无效

DTLgetvalueforkey 有效,但 DTLfetch 无效

以下示例\DTLgetvalueforkey检索信息没有问题,但是却\DTLfetch失败了:

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{data.csv}
Heading A, Heading B, Heading C
One,    Een,  1
Two,    Twee, 2
T_hree, Drie, 3
Four,   Vier, 4
\end{filecontents*}

\usepackage{datatool}

\begin{document}

\DTLloadrawdb
  [keys={HeadA,HeadB,HeadC}]
  {data}{data.csv}

\DTLdisplaydb{data}

\bigskip

% \DTLgetvalueforkey{<cmd>}{<key>}{<db name>}{<ref key>}{<ref value>}
% \DTLfetch{<db name>}{<col1 name>}{<col1 value>}{<col2 name>}

\textbf{Heading A} = `Two' corresponds to \textbf{Heading B} =
\DTLgetvalueforkey{\datavalue}{HeadB}{data}{HeadA}{Two}\datavalue% Twee

\textbf{Heading A} = `Two' corresponds to \textbf{Heading B} =
\DTLfetch{data}{HeadA}{Two}{HeadB}% Twee

\textbf{Heading A} = `T\_hree' corresponds to \textbf{Heading B} =
\DTLgetvalueforkey{\datavalue}{HeadB}{data}{HeadA}{T\_hree}\datavalue% Drie

% Should be the same as above, but not found
\textbf{Heading A} = `T\_hree' corresponds to \textbf{Heading B} =
\DTLfetch{data}{HeadA}{T\_hree}{HeadB}% Drie

\end{document}

这是为什么?可以\DTLfetch修复这里吗?

该问题与使用_内部 CSV 条目有关。我正在处理的输入包含此内容,因此我几乎无法将其删除。

答案1

datatool 用户指南提到了以下内容\DTLfetch

\DTLfetch{<db name>}{<col1 name>}{<col1 value>}{<col2 name>}

这将获取 的值,并在的<col2 name>值为 的第一行中显示 的值。(请注意,所有参数均已展开。)<col1 name><col1 value>

此处的扩展导致了此问题。要解决此问题,请获取T\noexpand\_hree而不是T\_hree

在此处输入图片描述

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{data.csv}
Heading A, Heading B, Heading C
One,    Een,  1
Two,    Twee, 2
T_hree, Drie, 3
Four,   Vier, 4
\end{filecontents*}

\usepackage{datatool}

\begin{document}

\DTLloadrawdb
  [keys={HeadA,HeadB,HeadC}]
  {data}{data.csv}

\DTLdisplaydb{data}

\bigskip

% \DTLgetvalueforkey{<cmd>}{<key>}{<db name>}{<ref key>}{<ref value>}
% \DTLfetch{<db name>}{<col1 name>}{<col1 value>}{<col2 name>}

\textbf{Heading A} = `Two' corresponds to \textbf{Heading B} =
\DTLgetvalueforkey{\datavalue}{HeadB}{data}{HeadA}{Two}\datavalue% Twee

\textbf{Heading A} = `Two' corresponds to \textbf{Heading B} =
\DTLfetch{data}{HeadA}{Two}{HeadB}% Twee

\textbf{Heading A} = `T\_hree' corresponds to \textbf{Heading B} =
\DTLgetvalueforkey{\datavalue}{HeadB}{data}{HeadA}{T\_hree}\datavalue% Drie

\textbf{Heading A} = `T\_hree' corresponds to \textbf{Heading B} =
\DTLfetch{data}{HeadA}{T\noexpand\_hree}{HeadB}% Drie

\end{document}

如果你根据宏中的内容进行搜索,例如

\def\Three{T\_hree}
\DTLfetch{data}{HeadA}{\Three}{HeadB}% Drie

你仍然会遇到问题。在这里你仍然需要避免扩展\_。你可以使用将\letting分组\_到 来实现这一点\relax

\def\Three{T\_hree}
{\let\_\relax
\DTLfetch{data}{HeadA}{\Three}{HeadB}}% Drie

其他选择包括\_ 强壮的(通过etoolbox\robustify{\_},比如说)。

相关内容