Biblatex 错误:\DeclareCaseLangs{} 未定义

Biblatex 错误:\DeclareCaseLangs{} 未定义

我有多个包含参考书目的文档,但这些文档不再编译。它们都使用\DeclareCaseLangs宏来调整参考书目格式。

如果没有所有自定义宏和包,错误仍然存​​在,编译日志打印:

(/usr/local/texlive/2020/texmf-dist/tex/latex/biblatex/biblatex.cfg
File: biblatex.cfg 
))
! Undefined control sequence.
l.6 \DeclareCaseLangs
                   {american}
? x

从 复制宏定义blx-case-latex2e.sty仍然会导致undefined control sequence

一种解决方法是对语言声明进行注释,但这是不可接受的,因为它会破坏参考书目中的条目格式。

以下是 M(N)WE:

\documentclass{article}

\usepackage{biblatex}

\DeclareCaseLangs{american}


\begin{document}

test

\end{document}

TexLive 2020已使用最新版进行测试,lualatex 1.12.0并且pdflatex 3.14159265-2.6-1.40.21

答案1

正如 Ulrike 在评论中指出的那样,这是一个错误biblatexv3.16 中的一个错误(https://github.com/plk/biblatex/issues/1090)。目前正在进行修复。

问题在于,需要根据文档编码来加载大小写转换代码。为了避免加载顺序问题,最好在钩子中检测文档编码\AtBeginDocument。但如果我们只在此时加载大小写转换代码,其命令在文档序言中是未定义的。

目前有两种解决方法。最直接的解决方法是转移\DeclareCaseLangs到一个钩子(保证在 的钩子处理\AtBeginDocument后执行)。biblatex\AtBeginDocument

\documentclass{article}

\usepackage{biblatex}

\AtBeginDocument[biblatex/declarecaselangs]{%
  \DeclareCaseLangs{american}%
}
\DeclareHookRule{begindocument}{biblatex/declarecaselangs}{after}{biblatex}


\begin{document}
test
\end{document}

如果你不能接受对文档序言进行这种程度的更改,你可以尝试以下代码

\documentclass{article}

\usepackage{biblatex}

\makeatletter
\blx@checkencoding
\blx@deferoption@casechanger
\blx@casechange@postload
\let\blx@deferoption@casechanger\relax
\let\blx@casechange@postload\relax
\makeatother

\DeclareCaseLangs{american}


\begin{document}
test
\end{document}

之间的代码\makeatletter...\makeatother执行直接加载案例更改代码的相关部分\AtBeginDocument,然后禁用它。然后您可以\DeclareCaseLangs在此代码块之后照常使用。

修复版本biblatex发布后,请不要继续使用此解决方法。

相关内容