LaTeX 和 BibTeX 之间的“协议”究竟是什么?
也就是说,如果我运行latex foo
、bibtex foo
和latex foo
,信息究竟如何从 LaTeX 流向 BibTeX 并流回?
我的当前猜测数据流如下:
- LaTeX 生成文件
foo.aux
。 - BibTeX 读取文件
foo.aux
。它只关注\citation{...}
、\bibstyle{...}
和形式的行\bibdata{...}
。 - BibTeX 生成文件
foo.bbl
。 - 当 LaTeX 注意到
foo.bbl
存在时,\bibliography
命令的行为就像\input{foo.bbl}
。
这是准确的吗?还是还有更多内容?例如,\citation{...}
始终是一行文本?
是否有一些常用的文档类和包会以某种方式影响协议?显然情况biblatex
会有所不同,但有什么不太明显的地方需要注意吗?
背景:我有兴趣编写一个脚本,可以将其用作 BibTeX 的替代品(从 LaTeX 的角度来看,没有任何变化,但文件的生成foo.bbl
会有所不同)。
答案1
您的猜测或多或少是正确的,包括biblatex
稍微改变方法的事实(其他软件包也会对其进行修改,但程度不同)。以最简单的单个.tex
文件的情况为例,不需要多个参考书目或类似内容:
\bibliographystyle
\bibstyle{...}
将该行写入.aux
文件:因此可以在序言中给出\bibliography
\bibdata{...}
将该行写入文件,并且如果文件可用的话,.aux
还输入文件。.bbl
\cite
\citation{...}
向文件中写入一行.aux
,并在 LaTeX 文档中创建引用\nocite
将\citations{...}
一行写入.aux
文件,但不在 LaTeX 文档中执行任何操作。
当 BibTeX 读取.aux
文件时,它会查找一行\bibstyle
和\bibdata
多行\citation
。然后它会写入一个.bbl
文件,但写入的内容取决于.bst
文件中的指令。通常的惯例是.bbl
文件将只包含bibliography
保存格式化引文的环境,尽管情况并非总是如此。
此工作流程可以添加许多内容。例如,biblatex
定义\bibliography
要在序言中使用,因为它不是使用.bbl
包含数据的文件进行直接打印。可以使用多个.aux
文件创建一组.bbl
文件来创建多个参考书目。我还看到了一种实现,其中参考书目的 XML 版本被写为.bbl
文件内的 LaTeX“注释”。这些方法仍然使用相同的底层接口,因为 BibTeX 仍然在文件中查找相同的命令.aux
并写入.bbl
文件。
以 为例multibib
,在 LaTeX 端它为每种新的参考书目类型定义了一组命令,例如
\newcites{sec}{Secondary Literature}
创建一个新的引用命令
\citesec{...}
这些新命令会写入与.aux
主文件不同的文件,这意味着 BibTeX 必须运行两次,一次在文件上运行\jobname.aux
,一次在sec.aux
。这将生成二 .bbl
文件\jobname.bbl
和,然后分别由和sec.bbl
正常读取。因此,整个过程与标准情况几乎没有变化,只是涉及的文件更多了。\bibliography
\bibliographysec
答案2
是的,默认情况下只有一个辅助文件。但可以有 2 个或更多辅助文件,例如使用multibib
或chapterbib
或 ...multibib
您必须运行主辅助文件和用户定义的文件;它的扩展名也是 .aux 因为chapterbib
每个章节都有一个辅助文件。两种情况都很容易处理:bibtex *.aux
。包也一样bibunits
。