旧答案:

旧答案:

以下示例编译时出现错误:

\documentclass{article}

\usepackage[english]{babel}\usepackage{csquotes}

\usepackage{listings}%\usepackage{listingsutf8}

\usepackage[style=ieee]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{bib.bib}
    @Article{A1, title = {A b}}
    @Article{A2, title = {A~b}}
\end{filecontents}

\addbibresource{bib.bib}

\begin{document}

    A: \cite{A1}.\\
    B: \cite{A2}.\\

    \printbibliography

\end{document}

l.23未定义控制序列。

某些原因可能导致~参考书目条目中的字符对 LaTeX 造成混淆,因为\cite{A2}注释掉的文档编译时没有错误。

Result after removing <code>\cite{A2}</code>

无论是更改\usepackage[english]{babel}\usepackage{babel}
还是更改\usepackage[style=ieee]{biblatex}\usepackage{biblatex}
或者删除\usepackage{listings}(这是必要的,但它的应用已从 MWE 中删除),
都会导致文档编译时不会出现错误,因此涉及四个因素:所有这三个包以及参考书目中波浪符号的使用。

我无法找出这种不兼容的原因,但解决这个问题对我来说非常有用。

答案1

编辑:

最近(2019年9月)listings已更新,此问题不再存在。


正如 Ulrike Fischer 在下面的评论中所说,这是 中的一个错误listings。包使用\lccode来定义字符类型以供以后使用。这个\lccode技巧之所以使用,~是因为它是 LaTeX 中的一个标准活动字符。但listings“忘记”将其重置\lccode为原始值,然后\the\lccode`~保持等于122( 的值z)。

要修复此问题,您可以在加载后立即重置\lccode~此外listingsegreg 发现这里,同样的问题也发生在 上\/,因此可以对两者使用相同的修复方法:

\usepackage{listings}
\lccode`~=0 % Fix for ~
\lccode`\/=0 % Fix for \/ (https://tex.stackexchange.com/a/202621/134574)

旧答案:

该问题实际上与无关biblatex。以下 MWE 引发了相同的错误:

\documentclass{article}
\usepackage{babel}
\usepackage{listings}
\begin{document}
\MakeLowercase{A~b}
\end{document}

错误是:

! Undefined control sequence.
<to be read again> az
                     b
l.12 \MakeLowercase{A~b}

发生这种情况是biblatex因为它使用了\MakeLowercase

babel我认为,该错误是由于和的相互作用导致的某些不兼容造成的listings

显然\lccodeof~被定义为z,而 thisz未定义。一种解决方法(不确定是否是最佳选择)是进行以下定义:

\begingroup\lccode`~=`z\lowercase{\endgroup\let~= }

那么你的 MWE 工作正常:

\documentclass{article}

\usepackage[english]{babel}\usepackage{csquotes}

\usepackage{listings}%\usepackage{listingsutf8}

\usepackage[style=ieee]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{bib.bib}
    @Article{A1, title = {A b}}
    @Article{A2, title = {A~b}}
\end{filecontents}

\addbibresource{bib.bib}

\begingroup\lccode`~=`z\lowercase{\endgroup\let~= }

\begin{document}

    A: \cite{A1}.\\
    B: \cite{A2}.\\

    \printbibliography

\end{document}

相关内容