我正在使用数据工具创建问题数据库,其中我为每个问题提供了标签。编译时,所有数据库文件(50 个文件)都包含在一个主文件中。编译后输出是一个包含问题的 pdf 文件,根据标签排序。但编译花了 28 个小时才生成一个 300 页的输出文件。输出文件是否可以是排序的 tex 文件,这样我就不需要每次都包含所有数据库文件了?
答案1
最好使用外部工具来执行排序。提供的排序命令datatool
实际上仅适用于小型 ASCII 数据库。
这datatooltk
应用程序旨在预处理数据以供使用。它既可以从命令行以批处理模式运行,也可以在 GUI 模式下运行。它可以从 CSV 文件、ODS 或 XLS 电子表格或 SQL 数据库(目前只有 mysql)导入数据。它以可以轻松加载的datatool
格式保存数据。datatool
\DTLloaddbtex
举个例子,这里有一个仅用于datatool
加载和排序数据,然后显示它的文档:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{longtable}
\usepackage{datatool}
\DTLloaddb{data}{country-codes.csv}
\DTLsort{name}{data}
\begin{document}
\DTLdisplaylongdb{data}
\end{document}
这country-codes.csv
文件包含 200 多个国家代码。前几行是:
code,name
ad,Andorra
ae,United Arab Emirates
af,Afghanistan
ag,Antigua and Barbuda
由于 CSV 文件包含 UTF-8 字符,测试文件需要加载inputenc
(和fontenc
)。还需要longtable
才能使用\DTLdisplaylongdb
。由于longtable
使用了,构建过程需要两次 LaTeX 调用,每次调用都会进行排序。
我命名了这个文件test.tex
并创建了一个名为的小型 bash 脚本buildtest
:
#!/bin/sh
pdflatex test
pdflatex test
然后运行time buildtest
,显示构建时间:
real 0m31.654s
user 0m31.477s
sys 0m0.051s
然后我修改test.tex
为:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{longtable}
\usepackage{datatool}
\DTLloaddbtex{\countrydata}{country-codes.dbtex}
\begin{document}
\DTLdisplaylongdb{\countrydata}
\end{document}
并buildtest
改为
#!/bin/sh
datatooltk --output country-codes.dbtex --csv country-codes.csv --sort name
pdflatex test
pdflatex test
现在运行之前只执行一次排序pdflatex
。排序后的数据存储在中country-codes.dbtex
。构建时间现在是
real 0m2.182s
user 0m1.202s
sys 0m0.126s
这要快得多。datatooltk
只有当原始数据发生变化时才需要执行此步骤。
\DTLsort
使用(或\dtlsort
) 和使用之间的另一个区别datatooltk --sort
在于奥兰群岛的位置,它以 UTF-8 字符开头。在第二种情况下(使用datatooltk
),它被放置在列表的末尾。在第一种情况下(使用\DTLsort
),它被放置在列表的开头。