我在运行 Biber 时遇到了一个不熟悉的错误。该错误原来是由于使用在 中定义的旧 bibkeyids
而不是新 bibkey 造成的。当我切换到新 bibkey 时,Biber 成功完成。
不幸的是,我无法重现错误本身。但是,我设法产生了另一个问题,我怀疑它是同一潜在原因的较不严重的症状。这是一个稳定性问题,如果使用 中定义的键,就会发生这种ids
情况refsection
。
考虑以下 MWE:
\begin{filecontents}{\jobname.bib}
@article{new-key,
ids = {old-key},
author = {Author, A. N.},
title = {Title},
journal = {Journal},
year = 1978,
volume = 3,
number = 2,
pages = {1--43}}
\end{filecontents}
\documentclass{article}
\usepackage{biblatex}
\bibliography{\jobname}
\begin{document}
\textcite{old-key}
\begin{refsection}
\textcite{old-key}
\printbibliography
\end{refsection}
\printbibliography
\end{document}
当我运行编译循环pdflatex
-> biber
-> pdflatex
- biber
> pdflatex
-> biber
-> pdflatex
-> 等等时,我发现 之外的第一个引用refsection
是稳定的。一旦 bibkey 被解析,它就会保持解析状态。但 中的第二个引用并非如此refsection
。这个引用在解析之间交替:
并且没有得到解决:
我怎样才能避免这个问题,而不放弃和的极其有用的ids
功能refsection
?
答案1
我认为这是 biblatex 的一个错误。它重置了 中的键别名列表\blx@secinit
。对于 refsection 0,这并不重要,因为 是.bbl
在命令之后读取的,但它会破坏以下 refsections 的键别名列表。我认为只是缺少\ifcsundef
(就像其他命令一样):
\documentclass{article}
\usepackage{biblatex}
\makeatletter
\def\blx@secinit{%
\csgdef{blx@sections@\the\c@refsection}{true}% just to say we have a section for tests later
\ifcsundef{blx@bsee@\the\c@refsection}
{\global\cslet{blx@bsee@\the\c@refsection}\@empty}
{}%
\ifcsundef{blx@fsee@\the\c@refsection}
{\global\cslet{blx@fsee@\the\c@refsection}\@empty}
{}%
\blx@ibidreset@force
\blx@idemreset@force
\blx@opcitreset@force
\blx@loccitreset@force
% List to track all aliases in a section. We need to output all aliases
% to the .bcf every time so that they are visible to biber
\ifcsundef{blx@keyaliases@\the\c@refsection} %new
{\global\cslet{blx@keyaliases@\the\c@refsection}\@empty} %problem
{} %new
\ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment}
{\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty}
{}}
\makeatother
\bibliography{bibkey-test}
\begin{document}
\textcite{old-key,old-key-0}
\begin{refsection}
\textcite{old-key,old-key-1}
\printbibliography
\end{refsection}
\printbibliography
\end{document}