为什么我需要使用 \bibliographystyle 两次?

为什么我需要使用 \bibliographystyle 两次?

我正在 Windows 上安装最新的 MiKTeX 2.9.6668,安装过程相当简单(只有几个附加软件包)。在某个时候,我注意到我的源文件包含两个命令实例\bibliographystyle{...}。它在序言中被调用一次,在文档主体中被调用一次,就在使用 生成实际参考书目之前\bibliography{...}

删除第一个调用后,bibtex不再生成.bbl文件,因此我的文档中缺少参考书目。然后,我发现删除另一个调用使参考书目不再编译。文档将仅包含参考书目,如果两个都文档中提供了 调用,这对我来说似乎是多余的。在关于在哪里使用 的示例中\bibliographystyle,我看到了这两个选项,但我找到的所有资料都没有说它需要出现在两个地方。

我确实使用了makebstcustom-bib包来生成自定义bericht.bst书目样式。这种样式效果很好,我的书目看起来和我预期的一样,而且我是否使用自定义样式都没有区别plain——命令仍然必须两次都存在才能显示书目。

我的工具链正在运行latex-> bibtex-> latex-> latex,并且我正在使用标准 BibTeX.bib文件(否biblatex)。bibtex日志文件(.blg)包含以下内容:

This is BibTeX, Version 0.99dThe top-level auxiliary file: bericht.aux
I found no \bibstyle command---while reading file bericht.aux
(There was 1 error message)

无论\bibliographystyle我删除哪个实例,此错误消息都是相同的。

这个问题并不严重,因为只要两个调用都存在,一切都会按我想要的方式运行。但为什么会这样呢?

编辑:事实证明,我没有足够深入地缩小问题范围。当然,原因是我误解并误用了软件包提供的命令,而且我愚蠢地非常确信该命令与问题无关。这是导致问题的简化来源;我将立即发布答案。

% !TX TS-program = pdfLaTeX+MakeIndex+BibTeX
% !TEX encoding = UTF-8 Unicode

\documentclass[11pt,hidelinks]{report}

\usepackage[utf8]{inputenc}

\usepackage{geometry}
\geometry{a4paper}

\usepackage{cite}
\bibliographystyle{plain}

\usepackage{hyperref}
\usepackage{todonotes}

\usepackage{etoolbox}
\newtoggle{draft}
\toggletrue{draft}

\title{Article title}
\author{Author}

\begin{document}

\maketitle
\tableofcontents

\nocite{*}

\iftoggle{draft}{%
    \listoftodos
}
% Commenting this out causes bibtex failure.
% \bibliographystyle{plain}
\bibliography{bericht}

\end{document}

答案1

问题是我错误地应用了etoolbox软件包的一个功能,我过早地排除了它可能的原因(部分原因是它“似乎有效”)。

有问题的代码是\iftoggle缺少“else”块。

\iftoggle{draft}{%
    \listoftodos
}

如果没有额外的组(即使是空的)来表示切换为假时的输出,则此操作无法正常工作。\iftoggle在我的文档中,它紧接着参考书目,并导致了错误。 只需向切换添加一个空组即可:

\iftoggle{draft}{%
    \listoftodos
}{}

bibtex现在只需调用其中一个就可以正常工作\bibliographystyle,并且如果两个调用都在源中,则会发出错误消息:

This is BibTeX, Version 0.99d (MiKTeX 2.9.6700 64-bit)
The top-level auxiliary file: minimal.aux
The style file: plain.bst
Illegal, another \bibstyle command---line 21 of file minimal.aux
 : \bibstyle
 :          {plain}
I'm skipping whatever remains of this command

导致混淆的原因(我知道这不是错误地将其排除为潜在原因的借口!)是,即使缺少组,只要在\bibliographystyle调用之前重复,文档就可以正确生成\bibliography。我仍然不完全确定为什么它还需要被调用\iftoggle产生正确的输出。但这只是浏览软件包文档的结果。我错了。

相关内容