Biblatex 使用 biber 后端生成不完整的 .bcf

Biblatex 使用 biber 后端生成不完整的 .bcf

我正在开发一个乳胶文档类,遇到了一个相当奇怪的问题,biblatex并且biber。如所述这里,当我运行pdflatex然后biber对此minimal.tex文件进行操作时:

\documentclass{quantumarticle}
\usepackage[backend=biber]{biblatex}
\addbibresource{minimal.bib}
\begin{document}
\cite{Foo2035}
\printbibliography
\end{document}

有了这个minimal.bib

@article{Foo2035,
  author = {Foo, Bar},
  journal = {Journal},
  year = {2010},
  title = {Title},
  doi = {doi},
}

Biber 产生以下错误(记录到minimal.blg):

[0] Config.pm:354> INFO - This is Biber 2.6
[0] Config.pm:357> INFO - Logfile is 'minimal.blg'
[33] biber:302> INFO - === Tue Dec 13, 2016, 16:21:37
[46] Utils.pm:180> ERROR - minimal.bcf is malformed, last biblatex run probably failed. Deleted minimal.bbl
[46] Biber.pm:114> INFO - ERRORS: 1

事实上,检查后minimal.bcf发现,标签biblatex没有被关闭 ,也没有包含。文件以<bcf:section>minimal.bcf<bcf:sortlist>

  [...]
  <bcf:section number="0">
    <bcf:citekey order="1">Foo2035</bcf:citekey>

只需添加几行

  </bcf:section>
</bcf:controlfile>

然后biber再次运行会使错误消失,并且后续pdflatex运行会产生预期的输出。

用我的课程所基于的quantumarticle标准课程进行替换可以解决问题。article

当然,我并不指望你浏览我的整个文档类别来寻找错误,但我甚至不知道从哪里开始寻找问题。

什么可能使得biblatex写入不完整的.bcf文件而不引发任何错误?

答案1

问题在于ltxgrid,或者更确切地说是ltxutil它加载的包:你可以看到这一点

\documentclass{article}
\usepackage{etoolbox}
\usepackage{ltxgrid}
\usepackage{biblatex}
\addbibresource{minimal.bib}
\begin{document}
\cite{Foo2035}
\printbibliography
\end{document}

包裹的顺序重要的。

仔细追踪,你会发现ltxutil(不喜欢在没有的情况下被加载ltxgrid)确实

\def\enddocument{%
 \let\AtEndDocument\@firstofone
 \@enddocumenthook
 \@checkend{document}%
 \clear@document
 \check@aux
 \deadcycles\z@
 \@@end
}%

IE任意重新定义宏。如果你恢复这个

\documentclass{article}
\usepackage{etoolbox}
\let\savedenddocument\enddocument
\usepackage{ltxgrid}
\let\enddocument\savedenddocument
\usepackage{biblatex}
\addbibresource{minimal.bib}
\begin{document}
\cite{Foo2035}
\printbibliography
\end{document}

问题消失了(然后你在终端中看到一些奇怪的线条)。

问题在于 和 都etoolboxltxutil尝试设置各种钩子。使用 时etoolbox,代码是通过修补添加的,如果失败则使用回退,因此如果先加载 则不会出错etoolbox。另一方面,由于ltxutil只是 zap \enddocument,因此由 安装的任何东西etoolbox都会丢失。

所有这些都是biblatex在将材料放入所提供的钩子中时进行咬合的etoolbox,因此当钩子插入丢失时,材料也会被有效地咬合。


biblatex您可以通过添加来恢复写作

\makeatletter
\patchcmd\enddocument
  {\deadcycles}
  {\let\AfterEndDocument\@firstofone    
   \@afterenddocumenthook
   \deadcycles}
  {}
  {\AtEndDocument{%
     \let\etb@@end\@@end
     \def\@@end{%
       \let\AfterEndDocument\@firstofone
       \@afterenddocumenthook
       \etb@@end}}}
\makeatother

(这是etoolbox首先要做的)加载后ltxgrid:这会重新引入 使用的钩子biblatex。您会在终端输出中发现一些奇怪的行,这与以下事实有关:正常的写入机制lotlof。您会在终端输出中发现一些奇怪的行,这与以下事实有关:正常的写入ETC。已被修改ltxgrid。(这都是关于改变事物进入主垂直列表的方式,所以这并不奇怪:见xgalley此领域的团队方法,即多得多与任何不知道它的代码不兼容!)

相关内容