我目前正在学习如何使用该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