我在 Windows 11 上运行最小的、最新的 TeX Live 安装。我正在尝试使用biblatex
和biber
进行参考书目管理。
我遇到的问题是,我必须运行pdflatex
三次才能清除所有警告。我知道这是预期的行为bibtex
;但我的理解是biblatex
仅需一次pdflatex-biber-pdflatex
运行即可。
我在下面提供了 MWE,其中包含两个文件的内容,demo.tex
并且refs.bib
:
演示文本
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{refs.bib}
\begin{document}
According to Smith \cite{smith99}, blah blah blah.
\printbibliography
\end{document}
参考文献
@book{smith99,
title = {Clever Book Title},
author = {John Smith},
publisher = {Smith Publishing},
year = {1999}
}
这是我的方法:我首先运行命令pdflatex demo.tex
,终端输出这些警告:
LaTeX Warning: Citation 'smith99' on page 1 undefined on input line 6.
LaTeX Warning: Empty bibliography on input line 8.
LaTeX Warning: There were undefined references.
Package biblatex Warning: Please (re)run Biber on the file:
(biblatex) demo
(biblatex) and rerun LaTeX afterwards.
然后,我biber demo
按照指示运行。没有错误。
然后,我pdflatex demo.tex
再次运行,却看到以下警告:
LaTeX Warning: There were undefined references.
Package biblatex Warning: Please rerun LaTeX.
这很奇怪,因为输出的 PDF 看起来很好——它有文内数字引用以及参考书目。
当我运行pdflatex demo.tex
(第三次)时,输出中没有警告。
这种行为在各个试验中都是一致的。我尝试过pdflatex
不使用文件扩展名 ( pdflatex demo
) 来运行;我尝试过使用不同的键来代替smith99
;我尝试过其他源类型,例如online
或article
,但都无济于事。
这两个文件都位于文件夹中C:\demo
,并且此目录中没有其他文件。我已尽可能地尝试隔离问题,但biblatex
每次都提示我重新运行 LaTeX。
我也尝试过跑步latexmk -pdf demo.tex
,它跑了pdflatex-biber-pdflatex-pdflatex
。
是什么导致了这个问题?任何帮助都非常感谢。谢谢。
答案1
让我们看看在您的情况下运行 LaTeX 和 Biber 时会发生什么:
第一次运行 LaTeX 时,LaTeX 没有
biblatex
任何关于参考文献的信息smith99
,因此 LaTeX 报告未定义的引用和空的参考书目。biblatex
警告先运行 Biber,然后再运行 LaTeX。但在这次运行中,它还会写入一个bcf
文件,其中包含有关所需资源和引用请求的信息。当 Biber 运行时,它会读取文件
bcf
并使用有关引用和资源的信息来生成文件bbl
。在运行此 LaTeX 时,
biblatex
它会读取bbl
文件并使用信息生成通常已经有效的 PDF。但它无法bbl
从aux
文件中读取某些信息,例如参考上下文或文件的 md5 校验和(因为 Biber 尚未更改文件aux
)。因此它报告可能仍存在更改,例如,因为假定的参考上下文可能是错误的。在运行 LaTeX 时,它还会将文件的有效 md5 校验bbl
和以及参考上下文等其他信息写入aux
文件。在运行此 LaTeX 时,
biblatex
已经可以将文件的 md5 校验aux
和与找到的文件的 md5 校验bbl
和以及其他信息(如参考上下文)进行比较。因此(连同在文件中找到的所有参考bcf
)现在它知道,不需要再运行 LaTeX。
因此,正如你所看到的,最后一次 LaTeX 运行并不总是需要获得有效的 PDF,但至少需要它来制作biblatex
知道,不再需要运行 LaTeX(或 Biber)。但这并不是总是情况确实如此。可能存在这样的情况,需要执行步骤 4 才能获得有效的 PDF。
答案2
重新运行消息不需要正确。例如,这里也会发出重新运行消息:
\documentclass{article}
\begin{document}
\section{test}\label{test}
\end{document}
LaTeX 确实检测到标签已更改,但并未检查此标签是否实际使用以及更改是否相关。在您的 biblatex 示例中也发生了类似情况(其他发出重新运行消息的软件包也发生了类似情况):它错误地认为需要进行另一次编译。
人们可以自然地尝试改进此类测试并捕捉这些情况。问题是这是否值得:对于小文档,您可以节省一次编译,但在实际文档中无论如何都需要第二次或第三次编译,因此通过使测试更复杂(和更慢)您不会获得任何好处。
答案3
您在此网站上找到的信息部分已弃用。特别是这个答案可以追溯到 2011 年,确实使用 TL2013 安装测试您的示例证实当时在第二次运行结束时没有提示再运行一次。但从那时起 biblatex 已经发展起来了。
一般来说,无论如何,通常需要 3 次 LaTeX 运行:例如,\tableofcontents
只会在第二次运行中排版材料。在article
课堂上,这很可能会导致材料因注入的目录而发生变化(chapter
课堂上不太可能发生这种情况,因为它使用类似章节的渲染,执行 \cleardoublepage
,并且页码样式可以从罗马变为阿拉伯,因此目录中的额外内容不会导致文档的页码发生变化)。一般来说,由于第一次运行将数据存储在辅助文件中,因此第二次运行中发生的任何事情都容易受到某些参考资料页码变化的影响,因此通常需要第三次运行。
只有简单的文档才需要运行 2 次,更不用说 1 次运行了。
答案4
只是为了比较。
如果您使用的是 OpTeX,则只需运行两次:optex
-optex
并且不需要外部程序(如 Biber)。我使用了refs.bib
与您的问题中给出的完全相同的文件。我准备了以下demo.tex
文件:
\fontfam[lm]
According to Smith \cite[smith99], blah blah blah.
\usebib/s (iso690) refs
\bye
在第一次运行之前optex
,没有demo.ref
文件(该*.ref
文件类似于 LaTeX 的、、、、aux
等文件放在一起,但它只是一个用于所有目的的单个文件)。OpTeX 的第一次运行报告:toc
lof
lot
bbl
This is LuaTeX, Version 1.17.0 (TeX Live 2023)
restricted system commands enabled.
(./demo.tex This is OpTeX (Olsak's Plain TeX), version <1.12+ May 2023>
(/home/olsak/texmf/tex/optex/base/f-lmfonts.opm
FONT: [Latin Modern] -- \LMfonts (TeX Gyre fonts based on Computer Modern)
...)
WARNING l.3: {} \cite [smith99] unknown. Try to TeX me again.
(/home/olsak/texmf/tex/optex/base/usebib.opm)
(/home/olsak/texmf/tex/optex/base/bib-iso690.opm) (./refs.bib)
OpTeX: Sorting \_citelist (en) ...
WARNING l.5: Missing field "address" in [smith99].
WARNING l.5: Missing field "isbn" in [smith99].
[1...]
WARNING l.7: Try to rerun, demo.ref file was created.
Output written on demo.pdf (1 page, 9699 bytes).
Transcript written on demo.log.
首次运行后,pdf 输出如下所示:
根据史密斯 [??] 的说法,等等等等。
[1] 史密斯,约翰。《巧妙的书名》。史密斯出版社,1999 年。
这意味着\cite
宏对标签一无所知[smith99]
,它只打印了 ??。此外,它将标签添加[smith99]
到\_citelist
。然后宏\usebib
读取refs.bib
文件,在此处找到[smith99]
标签(也许其他人在文档中使用了 cite-labels 并在宏中累积\_citelist
),然后对 进行排序,最后按照 bib 样式文件中声明的格式规则\_citelist
打印。打印时,数字被分配给标签,因此 OpTeX 知道,数字为 1。此信息保存到文件中。\_citelist
bib-iso690.opm
[smith99]
demo.ref
第二次运行从读取demo.ref
文件开始,然后创建文档。所有需要的信息都是已知的,结果是:
This is LuaTeX, Version 1.17.0 (TeX Live 2023)
restricted system commands enabled.
(./demo.tex This is OpTeX (Olsak's Plain TeX), version <1.12+ May 2023>
(./demo.ref) (/home/olsak/texmf/tex/optex/base/f-lmfonts.opm
FONT: [Latin Modern] -- \LMfonts (TeX Gyre fonts based on Computer Modern)
...)
(/home/olsak/texmf/tex/optex/base/usebib.opm)
(/home/olsak/texmf/tex/optex/base/bib-iso690.opm) (./refs.bib)
OpTeX: Sorting \_citelist (en) ...
WARNING l.5: Missing field "address" in [smith99].
WARNING l.5: Missing field "isbn" in [smith99].
[1...]
Output written on demo.pdf (1 page, 9699 bytes).
Transcript written on demo.log.
根据史密斯[1]的说法,等等等等。
[1] 史密斯,约翰。《巧妙的书名》。史密斯出版社,1999 年。
该文件的 md5sum 检查demo.ref
是在第二次运行结束时完成的,但该文件并未更改,因此我们没有收到这样的警告:
WARNING l.7: Try to rerun, demo.ref file was changed.
我们只能看到有关缺少字段的警告address
,isbn
因为它们是通过样式文件@book
打印条目时必填的。bib-iso690