次の 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 では:
フランス語のタイポグラフィにアクティブを使用しないため、このようなことは発生せず、問題が発生することはありません。
私が提案した修正は、適切な場所に2番目のテストを追加することです。短いパッチとして
\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
。まだ問題が発生する可能性もありますが、現時点ではこれが「リスクが最も低い」修正方法のようです。前述したように、このテストがなぜ存在するのかについての記述が欠けています。その理由がすぐにはわかりません。