datatool:如何可靠地将数据库存储在 \AtEndDocument (或类似的钩子)中

datatool:如何可靠地将数据库存储在 \AtEndDocument (或类似的钩子)中

在包含许多子文件和作者的大型报告中,我使用该datatool包写出一些在文档中收集的数据。在文档末尾,数据应存储在带有的 CSV 文件中\DTLsavedb。为此,我目前正在使用\AtEndDocument钩子。

问题是这种方法不太可靠。通过查看源datatool代码,我认为这是因为datatool没有写入文件\immediate,因此写入被延迟到发货时间。但是,如果文档末尾没有剩余内容可发货,则文件永远不会被写入。

我可以尝试修补datatool以使用\immediate,但是,就性能而言,延迟写入可能是一件好事。因此,更好的解决方案可能是以某种方式确保在文档末尾所有未完成的数据都独立于 shipout 例程写入?或者也许我可以使用“最后一页钩子”来代替\AtEndDocument

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{datatool}
\usepackage{lipsum}

\AtBeginDocument{%
  \DTLgnewdb{importantguys}%
}
\AtEndDocument{%
  \DTLsavedb{importantguys}{importantguys.csv}%
}

\newcommand{\importantguy}[2]{%
  \DTLnewrow{importantguys}%
  \DTLnewdbentry{importantguys}{firstname}{#1}%
  \DTLnewdbentry{importantguys}{surname}{#1}%
  \paragraph{#1 #2:}%
}

\begin{document}
  \lipsum
  \importantguy{Foo}{Bar} does cool stuff.
  \importantguy{Computer}{Mouse} is really important for the project.
  \lipsum
  \importantguy{Becky}{Brewer} helps to keep us running.
  \clearpage
\end{document}

答案1

延期写作和包装atenddvi

软件包atenddvi提供了钩子\AtEndDvi,用于获取最后一页输出的内容。至少需要运行两次 LaTeX 才能知道哪一页是最后一页。无论名称如何,输出类型 DVI、PDF 或其他类型都无关紧要。

立即撰写并打包atveryend

如果您的数据不包含需要延迟写入的数据,则\DTLsaveddb可以将其修补为立即模式,如以下示例所示。它还使用atveryend带钩子的包\AtVeryEnd来处理有人通过以下方式添加重要人物的情况\AtEndDocument

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{datatool}
\usepackage{lipsum}
\usepackage{atveryend}

\AtBeginDocument{%
  \DTLgnewdb{importantguys}%
}
\AtVeryEndDocument{%
  \begingroup
    \let\SavedOpenout\openout
    \let\SavedWrite\write
    \def\openout{\immediate\SavedOpenout}%
    \def\write{\immediate\SavedWrite}%
    \DTLsavedb{importantguys}{importantguys.csv}%
  \endgroup
}

\newcommand{\importantguy}[2]{%
  \DTLnewrow{importantguys}%
  \DTLnewdbentry{importantguys}{firstname}{#1}%
  \DTLnewdbentry{importantguys}{surname}{#2}%
  \paragraph{#1 #2:}%
}

\begin{document}
  \lipsum
  \importantguy{Foo}{Bar} does cool stuff.
  \importantguy{Computer}{Mouse} is really important for the project.
  \lipsum
  \importantguy{Becky}{Brewer} helps to keep us running.
  \clearpage
\end{document}

文件importantguys.csv

firstname,surname
Foo,Bar
Computer,Mouse
Becky,Brewer

相关内容