我正在尝试为我的乳胶文档构建一个连续的构建器,它将latex和bibtex调用适当的次数。它检查myfile.fls
文件中的所有输入,所以我似乎知道所有输入都是。
但是如何判断何时停止迭代?没有任何输入改变就足够了吗?请注意,输入文件包含myfile.aux
等文件,因此系统中似乎有一些反馈,但我不知道是否遗漏了某些内容。
请注意,我不能说“3或4次”,因为它不断建立。如果输入发生变化,我可能需要运行3到4次,但更有可能我只需要运行一次。在极少数情况下,输入会改变类似引用的内容,这可能需要3次构建。我试图找出我发生这种情况的方式。
更多背景信息:我正在尝试找到latexmk in my answer to a previous question的替代品。我想替换它,因为它可能迭代3或4次,但我想在每次构建后得到反馈。
答案 0 :(得分:3)
There are really only four passes that are necessary。如果您正在尝试构建类似于ant脚本或makefile的内容,我会说您应该查找源.tex文件的更改,然后启动此过程:
如果Latex不需要为任何这些传递做额外的工作,它就不会这样做。
回应OP:
请注意,我不能说“3或4次”, 因为它不断建立。如果 输入更改,我可能需要运行它3 或4次,但更有可能我只会 需要运行一次。在一个罕见的 情况,输入会改变 像引用这样的东西 需要3个版本。我试着 找出我发生这种情况的方式。
ant脚本或makefile是您的朋友:使您的最终输出产品(例如.dvi文件)取决于您的源.tex和.bib文件。但是,说真的,你需要这四个通道才能确保你避免被任何角落案件困住。
回应评论:
假设我修正了一些拼写错误 段,我跑乳胶,现在有一个 完美版。有没有办法 告诉它没有更新.aux 文件,或.bbl文件等等 不需要全套通行证。
可能构建ant脚本或makefile,使得每个步骤都依赖于相应的中间文件,因此只有在发生更改时才会触发。我建议不要这样做有两个原因:
例如,当我撰写论文时,有一点我决定将一章分成两章并添加另一个附录会有所帮助。我所要做的就是改变我的\ 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)
我用以下算法编写了一个脚本:
myfile.fls
我注意到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也可能有用,虽然我记得对早期版本感到有点沮丧。