以下 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
:
羅伯特·克拉夫特 (Robert Craft),“斯特拉文斯基的‘最佳鳥類:羅伯特·克拉夫特 (Robert Craft) 解開了圍繞創造的故事”羅西尼奧爾,'”歌劇新聞,1982 年,第 1 期。 8、14-15、34。
請注意,Bird-Best 後面的右引號遺失了。
然而,對於lualatex
,則不存在這樣的問題。參考文獻的格式正確:
羅伯特·克拉夫特,《斯特拉文斯基的《鳥類最佳》:羅伯特·克拉夫特解開了圍繞創造的故事羅西尼奧爾,”歌劇新聞,1982 年,第 1 期。 8、14-15、34。
我已經嘗試了所有最新的穩定版和開發版分支biblatex
,包括 2.9a 和 3.0。該問題可能與csquotes
?
PLK、biblatex
作者和我已經在 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
不插入任何結束引號,但保存 if 以供將來使用。 (有幾個內部分支共享上述程式碼,因此它並不是立即顯而易見的。)
原作者biblatex
沒有給我們留下關於這段程式碼的用途的註釋,但我認為他的目的是允許\relax
使用顯式來防止移動標點符號
\mkbibquote{some odd text}\relax ,
問題在於,\if\noexpand\foo\relax
如果 是一個宏,則該構造為 true \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
.仍然有一些情況可能會出錯,但目前這似乎是「風險最低」的修復方法。正如我所說,缺少的是關於為什麼進行此測試的註釋:推理是什麼並不是立即顯而易見的!