为什么 \DTLgetkeyforcolumn 不起作用?

为什么 \DTLgetkeyforcolumn 不起作用?

我目前正在学习如何使用该datatool包。我有很多.txt文件需要自动处理。但如果datatool加载了错误类型的.txt文件,我需要能够检查它。我想要做的是检查列的键,但命令\DTLgetkeyforcolumn返回错误:

Undefined control sequence.
<argument> \db@row@id@w

l.58 \DTLgetkeyforcolumn{\colkey}{data}{1}

我完全不知道这意味着什么...源代码可以在datatool手动的。搜索该函数,你就会找到它。我真的不明白,也看不到任何地方\db@row@id@w。这可能是包中的一个错误吗?尝试重新定义该函数只会导致错误。

编辑:
最小工作示例:

\documentclass{article}

\usepackage{datatool}
\DTLloadrawdb{data}{data.txt} %load data.txt, store in database data

\begin{document}
  % Display the table, bold are the headers
  \DTLdisplaydb{data}

  % Search for header ColTwo and store index into \colindex
  \DTLgetcolumnindex{\colindex}{data}{ColTwo}
  \colindex % returns 2

  % Search the index and store the header into \colkey
  \DTLgetkeyforcolumn{\colkey}{data}{\colindex} % Error
  \colkey

\end{document}

数据.txt

ColOne,ColTwo,ColThree
a,b,2
c,d,5

根本没有任何输出。

答案1

我已向软件包维护者 (Nicola Talbot) 发送了一封邮件,他给了我一个临时解决方法。将以下内容粘贴到 下\usepackage{datatool}。此错误将在未来的补丁中修复。

\makeatletter
\renewcommand*{\@dtl@getkeyforcolumn}[3]{%
 \def\@dtl@get@keyforcolumn##1% before stuff
   \db@plist@elt@w% start of block
   \db@col@id@w #3\db@col@id@end@% index
   \db@key@id@w ##2\db@key@id@end@% key
   \db@type@id@w ##3\db@type@id@end@% data type
   \db@header@id@w ##4\db@header@id@end@% header
   \db@col@id@w #3\db@col@id@end@% index
   \db@plist@elt@end@% end of block
   ##5\q@nil{\def#1{##2}}%
 \edef\@dtl@tmp{\expandafter\the\csname dtlkeys@#2\endcsname}%
 \expandafter\@dtl@get@keyforcolumn\@dtl@tmp
   \db@plist@elt@w% start of block
   \db@col@id@w #3\db@col@id@end@ %index
   \db@key@id@w \@nil\db@key@id@end@% key
   \db@type@id@w \db@type@id@end@% data type
   \db@header@id@w \db@header@id@end@% header
   \db@col@id@w #3\db@col@id@end@% index
   \db@plist@elt@end@% end of block
   \q@nil
}
\makeatother

相关内容