Biblatex、refsection 和 ids 产生不稳定的输出。我该如何纠正这个问题?

Biblatex、refsection 和 ids 产生不稳定的输出。我该如何纠正这个问题?

我在运行 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}

相关内容