假设我有一份使用交叉引用以及 bibtex/biblatex 来管理参考书目的文档。目前我需要运行pdflatex + bibtex/biber + pdflatex
以生成最终文档。
这样做有点无聊;是否可以只需要一次调用?也许可以使用 LuaTeX 的脚本功能?
不同于这个问题,我对抽象层不感兴趣,只对如何在 *TeX 本身内实现它感兴趣。
编辑:那 \write18 命令呢?我知道它可以至少避免一次调用bibtex
。
编辑2:有两个人问我为什么不想要抽象层。
1 - 你需要吗?这是 *TeX 最基本的功能。自己管理编译过程的细节太过时了。我想让 *TeX 变得更好;在这种情况下,这意味着更容易使用。
2 - 抽象层增加了复杂性并降低了灵活性。您还必须担心其错误(我被不可靠的错误报告所困扰)。如果您想使用 LuaTeX 而不是 pdfTeX 进行编译怎么办?或者使用 biber 而不是 BibTeX?
答案1
当然...它甚至出奇的简单:
$ pdflatex --fmt=pdftex --shell-escape '\write18{pdflatex hello}\write18{bibtex hello}\write18{pdflatex hello}\bye'
但玩笑归玩笑,现实情况是,答案是否定的。正如 Will、Patrick 和 TH 已经写到的,宏格式需要支持它,而 (实际上) 没有宏包可以做到这一点。
答案2
不。由于交叉引用的非线性流程,您总是需要多次传递,而 TeX 并非设计为一次性完成这些传递。即使是 LuaTeX 也只能(在撰写本文时)执行一次排版传递。
ConTeXt 使用 LuaTeX 作为脚本语言,根据需要编译其文档,直到所有内容收敛,但它仍然包含多个排版过程。
对于 LaTeX 来说,事情就比较陈旧了;最近,Philipp Lehman 编写了一个名为logreq
帮助指示何时需要运行更多编译和其他程序。
答案3
你看过 latexmk 吗?
答案4
LaTeX 并未为此设置。但如果您可以控制输出(= 编写自己的宏包),那么您可以这样做。排版材料不需要第一次就放在 PDF 中。您可以排版文档,丢弃结果(但要记住交叉引用等),然后使用正确的交叉引用再次排版文档。如果您有前向引用(如目录),那么您需要知道目标在哪一页,这是您无法提前做到的一件事(大多数时候)。