如果緊跟著冒號,\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

羅伯特·克拉夫特 (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.仍然有一些情況可能會出錯,但目前這似乎是「風險最低」的修復方法。正如我所說,缺少的是關於為什麼進行此測試的註釋:推理是什麼並不是立即顯而易見的!

相關內容