我有多个包含参考书目的文档,但这些文档不再编译。它们都使用\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 在评论中指出的那样,这是一个错误biblatex
v3.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
发布后,请不要继续使用此解决方法。