对于 4.22 版本,latexmk声称
[s]支持使用 biber(带有 biblatex 包)作为 bibtex 的替代品来生成参考书目,并自动确定是否使用 bibtex 或 biber。
我决定试一试。我使用的是 Windows 7、Strawberry Perl、MiKTeX 2.8(包括 latexmk 4.22b)、Biber 0.7.3(在 PATH 环境变量中注册)和 TeXworks r.670(包括 latexmk 的设置)。结果:虽然 latexmk 通常似乎工作正常,但它总是将 BibTeX 调用为参考书目后端,即使我的 LaTeX 文件的序言包含\usepackage[backend=biber]{biblatex}
。(相比之下,Biber 在 texify(相当于 latexmk 的 MikTeX)下工作正常。)起初,我以为我错过了一些显而易见的东西(我仍然对这种可能性持开放态度),但后来我查看了latexmk.pl
。以下是代码行 4204--4207:
my $bib_program = 'bibtex';
if ( exists $generated_log{"$bbl_base.bcf"} ) {
$bib_program = 'biber';
}
因此,如果满足涉及 bcf 文件(biblatex/Biber 控制文件)的某些条件,则应调用 Biber。在latexmk.pl
我的本地 texmf 树的副本中,我将上述代码替换为对所述 bcf 文件是否存在(或我认为如此)的测试:
my $bib_program = 'bibtex';
if ( -e "$bbl_base.bcf" ) {
$bib_program = 'biber';
}
结果:修改后的 latexmk 正确确定何时使用 Biber 而不是 BibTeX。(从 Biber 切换到 BibTeX 时,必须手动删除剩余的 bcf 文件。)
那么:我是否发现了 latexmk 4.22b 中的错误,或者我是否错过了涉及我的系统/TeX 发行版/编辑器的某些明显的东西?
编辑:为了让我的问题更加集中:我有兴趣了解 latexmk 的其他用户是否观察到了相同的行为(latexmk 从不调用 Biber)。如果是这样,如果有人提出一种解决方案,与我的“快速修复”不同,它不涉及冗余的 Biber 运行,我会很高兴。
编辑 2:Herbert 指出,Perl 在 Windows 和 Linux 上的行为可能有所不同。我将在赏金期结束后向 latexmk 的作者报告我的观察结果;我仍然对其他用户的报告感兴趣。
答案1
exists $generated_log{"$bbl_base.bcf"}
测试文件列表是否%generated_log
包含“$bbl_base.bcf”条目。在我看来,列表中缺少这样的条目%generated_log
,这就是调用失败的原因。如果您使用 -e 进行测试,结果通常相同,它实际上可以完成现在缺少的检查。%generated_log
您应该向作者报告。也可能是某些 Perl 函数的行为与 Linux 不同。
答案2
注意:2011 年 1 月 25 日的更新已移至单独的答案。
事实证明,问题并不出在 Windows 上,而是 MiKTeX。引用 latexmk 的作者 John Collins 的话:
与 TeXLive 的日志文件相比,MikTeX 生成的日志文件缺少一些信息。缺少的行的形式如下
\openout...
latexmk 用来推断 (pdf)latex 写入的文件的名称。
一个新版本的 latexmk (4.22c) 可以检测 Biber 的使用情况并与 MikTeX 兼容,可在以下网址获取:http://www.phys.psu.edu/~collins/latexmk/versions.html。