![DTLgetvalueforkey 有效,但 DTLfetch 无效](https://linux22.com/image/363977/DTLgetvalueforkey%20%E6%9C%89%E6%95%88%EF%BC%8C%E4%BD%86%20DTLfetch%20%E6%97%A0%E6%95%88.png)
以下示例\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
你仍然会遇到问题。在这里你仍然需要避免扩展\_
。你可以使用将\let
ting分组\_
到 来实现这一点\relax
:
\def\Three{T\_hree}
{\let\_\relax
\DTLfetch{data}{HeadA}{\Three}{HeadB}}% Drie