tex文件的输出是编译后排序后的tex文件吗?

tex文件的输出是编译后排序后的tex文件吗?

我正在使用数据工具创建问题数据库,其中我为每个问题提供了标签。编译时,所有数据库文件(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),它被放置在列表的开头。

相关内容