以下 biblatex 记录(嵌入在最小 LaTeX 示例中):
\begin{filecontents*}{\jobname.bib}
@article{test1,
Author = {Craft, Robert},
Title = {Stravinsky at His \mkbibquote{Bird-Best}: Robert Craft Untangles the Tales Surrounding the Creation of \foreignlanguage{french}{\mkbibemph{Le rossignol}}},
Journaltitle = {Opera News},
Date = {1982},
Volume = {46},
Number = {8},
Pages = {14-15, 34}
}
\end{filecontents*}
\documentclass{article}
\usepackage[autostyle=true, english=american, french=guillemets, german=guillemets]{csquotes}
\usepackage[french, german, american]{babel}
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{test1}
\printbibliography
\end{document}
被错误地渲染为pdflatex
:
罗伯特·克拉夫特,《斯特拉文斯基的‘最佳状态’:罗伯特·克拉夫特解开围绕创作的故事》红旗”,”歌剧新闻,1982,第8,14-15,34。
请注意,Bird-Best 后面的结束引号缺失。
然而,使用lualatex
则不存在这样的问题。参考文献的格式正确:
罗伯特·克拉夫特,《斯特拉文斯基的‘鸟之巅峰’:罗伯特·克拉夫特解开围绕创作的故事》红旗”歌剧新闻,1982,第8,14-15,34。
我已尝试了 的所有最新稳定版本和开发版本biblatex
,包括 2.9a 和 3.0。该问题可能与 有关csquotes
?
作者PLKbiblatex
和我已经在 GitHub 上讨论过这个问题(https://github.com/plk/biblatex/issues/259),但至今我们还无法查明原因。
答案1
在本例中,biblatex
使用了一个宏,\blx@usqcheck
它用于带有“移动”标点符号的美式引文。这会提前检查标点符号、空格等,但也包括检查:
\if\noexpand\@let@token\relax
\blx@usqcheck@i\blx@tempb
\fi
其中\blx@usqcheck@i\blx@tempb
不插入任何结束引号,但会保存以供将来使用。(有几个内部分支共享上述代码,因此不是很明显。)
的原作者biblatex
没有给我们留下任何关于这段代码的用途的注释,但我认为他的目的是允许\relax
使用显式的方法来防止移动标点符号
\mkbibquote{some odd text}\relax ,
问题在于,\if\noexpand\foo\relax
如果 是宏,则构造为真\foo
,而不仅仅是如果它的含义等于\relax
。(如果它是宏,则\noexpand
原语\foo
暂时等于,但如果说您已经完成了 ,则不等于。)\relax
\let\foo=a
这就引出了问题。当使用 pdfTeX 并且french
给出了 选项时babel
,字符:
处于“活动”状态,并且具有宏定义即使当前使用的语言不是法语。因此,测试biblatex
“走错了方向”:它在引号后面找到了一个宏,认为这是一个放松,并跳过了结束标点。LuaTeX 不会发生这种情况,因为它不使用:
法语排版的活动符号,所以这个问题永远不会出现。
我建议的修复方法是在正确的位置添加第二个测试:作为一个简短的补丁
\makeatletter
\def\blx@usqcheck#1#2{%
\def\blx@tempa{#1}%
\def\blx@tempb{#2}%
\ifx\@let@token\space
\blx@usqcheck@i\blx@tempa
\fi
\ifx\@let@token\@sptoken
\blx@usqcheck@i\blx@tempa
\fi
\if\noexpand\@let@token\relax
\ifx\relax\@let@token
\blx@usqcheck@i\blx@tempb
\fi
\fi
\expandafter\blx@usqcheck@ii\blx@quotepunct\relax&}
\def\blx@usqcheck@i#1#2&{\fi#1}
\makeatother
现在检查意义以下宏以 开头\relax
。仍有可能出错的情况,但目前这似乎是“风险最低”的修复方法。正如我所说,缺少的是关于为什么进行此测试的说明:原因并不明显!