\mkbibquote 不会关闭引号(如果后面紧跟着冒号)

\mkbibquote 不会关闭引号(如果后面紧跟着冒号)

以下 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。仍有可能出错的情况,但目前这似乎是“风险最低”的修复方法。正如我所说,缺少的是关于为什么进行此测试的说明:原因并不明显!

相关内容