可以同时使用 bibunits 和 multibib 吗?

可以同时使用 bibunits 和 multibib 吗?

我正在排版一本投稿的书,这本书有很多章节,每章都由不同的作者撰写。我的工作是确保所有投稿都使用大致相同的排版惯例和精选索引词。

对于参考文献,我们希望为每一章创建一个单独的列表。最初我是使用 来执行此操作的multibib,但似乎该包实际上在运行 pdflatex 时保持每个 .aux 文件打开,因此现在我已经编辑完一堆章节,我突然遇到了有限的写入堆栈。

所以我改用了bibunits,无论如何它更适合这份工作。

然而……其中一项贡献实际上有四个单独的参考书目。这又恰恰是multibib试图解决的问题,而我恰好从这项贡献开始,这解释了我最初选择该包的原因。

因此,我想要做的是,bibunits对所有贡献使用,并multibib在此特殊贡献中拆分参考文献。由于bibunits在继续下一个单元之前关闭每个单元,因此对于有限的写入堆栈,我应该是安全的。不幸的是,这些软件包似乎不能很好地协同工作。我猜这与这两个软件包都试图重新定义类似的相同命令有关(尽管,由于multibib明确定义了\citeXXXX每个参考书目单元的命令,XXXX我有点希望事情会顺利)

我得到的错误是标准的、臭名昭著的错误:

! TeX capacity exceeded, sorry [input stack size=5000].
<inserted text> 
                }\endwrite 
l.901 ...liographysyta{syta_vdweygaert-references}

!  ==> Fatal error occurred, no output PDF file produced!

同样引人注目的是,在某个时候我得到了一长串的行:

(./bu.aux) (./bu.aux) (./bu.aux) (./bu.aux) (./bu.aux) (./bu.aux) (./bu.aux)

好吧……回到我猜想的问题:我尝试获取单个章节的单独参考列表,同时为各个章节创建参考,但失败了。我该如何成功做到这一点?

答案1

因此,经过一些黑客攻击后,我实际上找到了一种(在我看来相当肮脏的)黑客技术,它可以让我的事情真正地为我工作,尽管有一个小小的修改:我不使用bibunits,而是使用chapterbib

它们无法协同工作的基本原因是它们重新定义了一组通用命令。因此,我的解决方案的基本思想是:确保它们永远不会同时处于“活动”状态。为了便于将来参考,让我透露我的解决方案和局限性(我知道)。以下所有内容都应放在文档的标题中。

该解决方案设计用于设置一个主文件,用于\include包含每个章节的文件。目的是“关闭”chapterbib包括一个需要有单独参考书目的章节文件。请注意,这意味着这个特定的章节文件永远不会有裸\cite命令。任何引用必须属于multibib处理

(原因是,当“关闭”包时chapterbib\cite命令以标准方式工作,这意味着在章节文件中\bibliography任何命令对应的命令在\cite主要的文件....希望这个相当长的解释是有意义的.. :P)

步骤1:创建将被加载覆盖的命令的备份multibib/ chapterbib

\makeatletter
\let\orig@bibliography\bibliography
\let\orig@thebibliography\thebibliography
\let\orig@include\include
\let\orig@cite\cite
\let\orig@nocite\nocite
\let\orig@bibliographystyle\bibliographystyle
\makeatother

第2步:加载multibib并定义所需的参考书目组。让我再次提醒您,稍后chapterbib每当我们将其“激活”时,它都会“关闭” multibib。结果是每次引用在由处理的章节文件中multibib 必须成为某个组的一部分,即你只能使用\citeXXX你使用 创建的组的命令\newcites{XXX}{Some title}。例如,你可以:

\usepackage{multibib}
\newcites{main}{\refname}
\newcites{man}{Manuscripts}
\newcites{com}{Complete Works}

步骤3:该multibib包实际上只重写了\bibliography\thebibliography命令。接下来存储这些重写的版本并返回到原始版本:

\makeatletter
\let\mbb@bibliography\bibliography
\let\mbb@thebibliography\thebibliography

\let\bibliography\orig@bibliography
\let\thebibliography\orig@thebibliography

\makeatother

步骤4:就chapterbib包而言,就好像multibib从未加载过一样,因此我们可以安全地加载前一个包并存储它所做的更改:

\usepackage{chapterbib}

\makeatletter
\let\cpb@bibliography\bibliography
\let\cpb@thebibliography\thebibliography
\let\cpb@bibliographystyle\bibliographystyle
\let\cpb@include\include
\let\cpb@cite\cite
\let\cpb@nocite\nocite

步骤5:此步骤是根据您自己的方便而定的,主要是为了安全输入 - 它需要创建一组宏,允许轻松地在“ chapterbib-mode”和“ multibib-mode”之间切换:

\def\bibmulti{% switch to multibib-mode
\let\bibliography\mbb@bibliography%
\let\thebibliography\mbb@thebibliography%
\let\bibliographystyle\orig@bibliographystyle%
\let\include\orig@include%
\let\cite\orig@cite%
\let\nocite\orig@nocite%
}

\def\bibchapter{% switch to 'chapterbib'-mode
\let\bibliography\cpb@bibliography
\let\thebibliography\cpb@thebibliography
\let\bibliographystyle\cpb@bibliographystyle
\let\include\cpb@include
\let\cite\cpb@cite
\let\nocite\cpb@nocite
}
\makeatother

针对您的文档bibmulti:那么如何使用所有这些?使用和宏后,您的“主”文件可能如下所示bibchapter

\documentclass{article} % or whatever class you want
\begin{document}
\include{chapter1}
\include{chapter2}
\bibmulti
\include{chapter3}
\bibchapter
\include{chapter4}
\end{document}

这假设上面描述的标题,其中确实chapterbib是第二个加载的。该包将启动前两章,每章都应该有命令:

\bibliographystyle{your_favourite_style}
\bibliography{your_bibtex_database}

然后,在包含第三章之前,我们“关闭”chapterbib和“打开” multibib;此文件应使用创建的特殊引用命令multibib,例如:

\citemain{ref1}
\citemain{ref2}
\citeman{manuscript1}
% etc...
% etc...
\bibliographystylemain{style_for_main}
\bibliographymain{main_references}

\bibliographystyleman{style_for_manuscripts}
\bibliographyman{manuscript_references}

\nocitecom{*}
\bibliographystylecom{style_for_com}
\bibliographycom{complete_works_references}

然后,处理完第 3 章后,bibchapter宏再次切换为使用chapterbib引用宏的版本。因此,当包含第 4 章时,我们回到原始情况,并且chapterbib包将再次确保为该章创建单独的参考列表。

我希望这足以解释其他人。也许我应该提到,在对本文档进行 TeXing 处理后,您需要bibtex对第 1、2 和 4 章的章节文件运行(chapterbib在单独章节的 '.aux' 文件中写入引文)以及对文件运行主辅助曼诺com.aux(这些是由 创建的文件multibib

限制 每次调用时\newcite,都会将一个元素推送到写入堆栈(我认为)。通过使用此设置,您可以避免对每个章节都执行此操作,但是如果您有许多章节需要处理,multibib您仍然可能会达到写入堆栈的限制。换句话说:此设置是为每章多组参考的情况很少见的情况而设计的(实际上,在我的特定情况下只有一章这样的章节)

可能还有其他我不知道的限制。我只是一个为我的 LaTeX 文档编写 TeX 的新手,所以我真的不能保证这个解决方案是否适用于其他系统和相关情况。

相关内容