LaTeX:我怎么知道停止构建(以编程方式)?

时间:2009-09-23 12:40:38

标签: latex build iteration

我正在尝试为我的乳胶文档构建一个连续的构建器,它将latex和bibtex调用适当的次数。它检查myfile.fls文件中的所有输入,所以我似乎知道所有输入都是。

但是如何判断何时停止迭代?没有任何输入改变就足够了吗?请注意,输入文件包含myfile.aux等文件,因此系统中似乎有一些反馈,但我不知道是否遗漏了某些内容。

请注意,我不能说“3或4次”,因为它不断建立。如果输入发生变化,我可能需要运行3到4次,但更有可能我只需要运行一次。在极少数情况下,输入会改变类似引用的内容,这可能需要3次构建。我试图找出我发生这种情况的方式。

(我不是在寻找像“使用latexmk”这样的答案,除非我能以某种方式使用 来查询是否需要重建文档,谢谢。)

更多背景信息:我正在尝试找到latexmk in my answer to a previous question的替代品。我想替换它,因为它可能迭代3或4次,但我想在每次构建后得到反馈。

4 个答案:

答案 0 :(得分:3)

There are really only four passes that are necessary。如果您正在尝试构建类似于ant脚本或makefile的内容,我会说您应该查找源.tex文件的更改,然后启动此过程:

  1. 运行LaTeX(查找所有参考书目,数字条目等)
  2. 运行BibTeX(为书目条目创建初始文本集)
  3. 运行LaTeX(使用参考书目填充文档,图参考)
  4. 运行LaTeX(一般好运:当引用需要两次传递才能完全填充时有一些极端情况)
  5. 如果Latex不需要为任何这些传递做额外的工作,它就不会这样做。

    回应OP:

      

    请注意,我不能说“3或4次”,   因为它不断建立。如果   输入更改,我可能需要运行它3   或4次,但更有可能我只会   需要运行一次。在一个罕见的   情况,输入会改变   像引用这样的东西   需要3个版本。我试着   找出我发生这种情况的方式。

    ant脚本或makefile是您的朋友:使您的最终输出产品(例如.dvi文件)取决于您的源.tex和.bib文件。但是,说真的,你需要这四个通道才能确保你避免被任何角落案件困住。

    回应评论:

      

    假设我修正了一些拼写错误   段,我跑乳胶,现在有一个   完美版。有没有办法   告诉它没有更新.aux   文件,或.bbl文件等等   不需要全套通行证。

    可能构建ant脚本或makefile,使得每个步骤都依赖于相应的中间文件,因此只有在发生更改时才会触发。我建议不要这样做有两个原因:

    1. 您正在复制LaTeX已经为您完成的工作和文件管理。
    2. 如果您更改了文档结构,则必须更新这些依赖项。
    3. 例如,当我撰写论文时,有一点我决定将一章分成两章并添加另一个附录会有所帮助。我所要做的就是改变我的\ include部分:

      \include{chapter1.tex}
      \include{chapter2.tex}
      \include{chapter3.tex}
      \include{chapter4.tex}
      \include{appendix.tex}
      

      到此:

      \include{chapter1.tex}
      \include{chapter2a.tex}
      \include{chapter2b.tex}
      \include{chapter3.tex}
      \include{chapter4.tex}
      \include{appendix.tex}
      \include{appendix2.tex}
      

      如果我试图在构建脚本中复制LaTeX的多次传递实现,那么每次进行类似的更改时,我都必须更新.tex,.aux等的所有依赖项。

      相反,我只是继续运行我的四次传递(在命令行使用别名)并继续编写我的文本。

答案 1 :(得分:1)

根据经验,你应该建立三次。在特殊情况下(使用makeindex,pagerefs和stuff),您可能需要第四次。

除了阅读日志文件外,没有办法确定。 IMO你应该只自动化一个构建,并输出给出的任何警告/错误;这样用户就可以决定是否重建。根据我的经验,如有必要,LaTeX会警告您重建。

答案 2 :(得分:1)

我用以下算法编写了一个脚本:

  1. 程序启动时,始终构建(使用pdflatex的-recorder标志,创建.fls文件)。
  2. myfile.fls
  3. 获取文件列表
  4. 等到文件发生变化(在任何有新时间戳的文件上使用md5sum),然后重建。
  5. 转到2。
  6. 我注意到myfile.fls包含所有依赖项,例如用于参考书目的myfile.bbl,用于目录的myfile.toc,以及用于大多数基本事物的myfile.aux。当需要重建时,这些更改依赖于此算法 ,我似乎能够重建,直到文件到达修复点。

    请注意,输出文件通常不同,因为.pdf文件往往包含构建日期。然而,这是无关紧要的,因为结果仍然成功收敛。

    我能想到的唯一不能解决的是它may not converge(感谢JouniK.Seppänen,在对another answer的评论中)。

答案 3 :(得分:0)

这是我一次做的。 非常 不完整,但可能是您的起点:

#!/usr/bin/perl

use strict;
use warnings;

my $prefix = 'LaTeX Warning:';
my $max_tries = 10;

while ( my $x = `pdflatex -halt-on-error mydocument` ) {

    if ( $x =~ /^$prefix Citation/m ) {
        `bibtex mh`;
        `pdflatex mh`;
    }

    last unless
        $x =~ /^$prefix Label\(s\) may have changed/m
            or $x =~ /^$prefix There were undefined references/m
            or $x =~ /^$prefix Reference/m
        ;
    last unless --$max_tries;
}

LaTeX::Driver也可能有用,虽然我记得对早期版本感到有点沮丧。