我正在开发一个乳胶文档类,遇到了一个相当奇怪的问题,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}
问题消失了(然后你在终端中看到一些奇怪的线条)。
问题在于 和 都etoolbox
在ltxutil
尝试设置各种钩子。使用 时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
。您会在终端输出中发现一些奇怪的行,这与以下事实有关:正常的写入机制lot
,lof
。您会在终端输出中发现一些奇怪的行,这与以下事实有关:正常的写入ETC。已被修改ltxgrid
。(这都是关于改变事物进入主垂直列表的方式,所以这并不奇怪:见xgalley
此领域的团队方法,即多得多与任何不知道它的代码不兼容!)