针对 biblatex 版本冲突自动覆盖 bbl

针对 biblatex 版本冲突自动覆盖 bbl

我通过 git 与一位合作者合作撰写论文。我们中的一些人使用不同的 latex 版本,特别是biblatex 3.9biblatex 3.11

如果作者 A 编译该文档并运行 biber,则会doc.bbl创建一个 biber 版本为 2.11 的文件。如果作者 B 进行了一些更改并尝试编译错误

Package biblatex Warning: File 'doc.bbl' is wrong format version - expected 2.9. 

出现。此时唯一的解决方案是doc.bbl手动删除并在版本 2.9 中重新创建。

能以某种方式自动执行此过程吗?如果检测到版本不匹配,我该如何告诉我的编译器删除 bbl 文件?

答案1

理想情况下,您应避免与同事共享临时文件(、、、.aux... )。仅共享非临时重要文件( 、、图像...)。请参阅.bbl.bcf.tex.bib在两台机器上匹配 biblatex了解更多解释为什么共享临时文件通常是不好的并且可能会出错。

Git 等复杂系统有办法忽略某些文件,Dropbox 也是如此https://superuser.com/q/469776。即使您首选的方法没有办法有选择地忽略文件,在提交之前删除临时文件的简单脚本在这里可能会更简单。

如果必须共享临时文件,可以使用一个简单的清理脚本,在编译之前删除临时文件(例如,参见删除外部/辅助文件?) 对我来说听起来是最好的解决方案。当然,这个文件不会在每次编译之前调用,只会在同步后的第一次编译之前调用。您可以通过先检查版本是否错误来使脚本更聪明(您必须解析正确的部分,.bbl并且必须与biblatex安装的预期版本进行比较,这似乎是可能的,但很麻烦)。

这是一个基于 LaTeX 的解决方案,.bbl通过打开一个空文件然后立即关闭它来用空文件覆盖错误版本的文件。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\addbibresource{biblatex-examples.bib}

\makeatletter
\newwrite\blx@jul@deletefile@out

% copy of the original macro from biblatex.sty
\def\blx@ifsigned#1#2{%
  \begingroup
  \let\blx@tempa\@firstoftwo
  \edef\blx@tempb{\csuse{blx@sig@#2}}%
  \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
  \openin\blx@bcfin #1.#2\relax
    \ifeof\blx@bcfin
    \else
      \endlinechar\m@ne
      \readline\blx@bcfin to \blx@tempc
      \ifeof\blx@bcfin
      \else
        \ifx\blx@tempb\blx@tempc
          \readline\blx@bcfin to \blx@tempc
          \edef\blx@tempb{\csuse{blx@ver@#2}}%
          \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
          \ifx\blx@tempb\blx@tempc
          \else
            \blx@warning@noline{%
              File '#1.#2' is wrong format version - expected \blx@bblversion}%
            \let\blx@jul@deletefile@do\@empty% <- added
          \fi
        \else
          \blx@error
            {File '#1.#2' not created by biblatex}
            {This file was apparently not created by biblatex.
             Rename it or\MessageBreak move it to a location were
             TeX will not find it. If this error\MessageBreak
             persists, consider redefining \string\blxauxsuffix.%
             See the biblatex\MessageBreak manual for details}%
          \let\blx@tempa\@secondoftwo
        \fi
      \fi
    \fi
  \closein\blx@bcfin
  \ifundef\blx@jul@deletefile@do% <- this conditional is new
    {}
    {\blx@warning@noline{Deleting file #1.#2}%
     \immediate\openout\blx@jul@deletefile@out #1.#2\relax
     \immediate\closeout\blx@jul@deletefile@out
     \global\undef\blx@jul@deletefile@do}%
  \expandafter\endgroup\blx@tempa}
\makeatother

\begin{document}
\cite{sigfridsson}
\printbibliography
\end{document}

我不会这么做,但如果你坚持使用 LaTeX 解决方案,那么它是非常通用的。

相关内容