Der folgende Biblatex-Eintrag (eingebettet in ein minimales LaTeX-Beispiel):
\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}
wird fälschlicherweise wie folgt wiedergegeben pdflatex
:
Robert Craft, „Stravinsky in Bestform: Robert Craft entwirrt die Geschichten rund um die Entstehung vonLe Rossignol,'”Neuigkeiten aus der Oper, 1982, Nr. 8, 14–15, 34.
Beachten Sie, dass das schließende Anführungszeichen nach Bird-Best fehlt.
Bei lualatex
gibt es dieses Problem jedoch nicht. Die Referenz ist korrekt formatiert:
Robert Craft, „Stravinsky in Bestform: Robert Craft entwirrt die Geschichten rund um die Entstehung vonLe Rossignol”,Neuigkeiten aus der Oper, 1982, Nr. 8, 14–15, 34.
Ich habe alle aktuellen stabilen und Entwicklungszweige von ausprobiert biblatex
, einschließlich 2.9a und 3.0. Das Problem hängt wahrscheinlich mit zusammen csquotes
?
PLK, biblatex
der Autor und ich haben dies bereits auf GitHub diskutiert (https://github.com/plk/biblatex/issues/259), aber bisher ist es uns nicht gelungen, die Ursache zu finden.
Antwort1
Im beschriebenen Fall biblatex
wird ein Makro namens verwendet \blx@usqcheck
, das für Zitate im US-Stil mit „beweglicher“ Interpunktion verwendet wird. Dies prüft im Voraus auf Interpunktion, Leerzeichen usw., enthält aber auch eine Prüfung:
\if\noexpand\@let@token\relax
\blx@usqcheck@i\blx@tempb
\fi
wobei \blx@usqcheck@i\blx@tempb
kein schließendes Anführungszeichen eingefügt wird, es aber für die zukünftige Verwendung gespeichert wird. (Es gibt mehrere interne Zweige, die den obigen Code gemeinsam nutzen, daher ist dies nicht sofort offensichtlich.)
Der ursprüngliche Autor biblatex
hinterlässt keine Hinweise darauf, was dieser Code bewirken sollte, aber ich denke, er wollte die \relax
Verwendung eines expliziten Befehls ermöglichen, um die Verschiebung von Satzzeichen zu verhindern.
\mkbibquote{some odd text}\relax ,
Das Problem besteht darin, dass die Konstruktion \if\noexpand\foo\relax
wahr ist, wenn \foo
überhaupt ein Makro ist, und nicht nur, wenn es in der Bedeutung gleich ist mit \relax
. (Das \noexpand
Primitiv macht \foo
vorübergehend gleich mit , \relax
wenn es ein Makro ist, aber nicht, wenn Sie beispielsweise ausgeführt haben \let\foo=a
.)
Das führt uns zum Problem. Wenn pdfTeX verwendet wird und die french
Option für angegeben wurde babel
, ist das Zeichen :
'aktiv' und hat eine Makrodefinitionauch wenn die aktive Sprache nicht Französisch ist. Daher geht der Test in biblatex
die „falsche Richtung“: Er findet ein Makro nach dem Zitat, denkt, es handele sich um ein Relax und überspringt die schließende Interpunktion. Das passiert bei LuaTeX nicht, da es kein Active :
für französische Typografie verwendet, daher tritt das Problem nie auf.
Die von mir vorgeschlagene Lösung besteht darin, einen zweiten Test an der richtigen Stelle hinzuzufügen: als kurzen Patch
\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
Damit wird überprüft, ob dieBedeutungdes folgenden Makros beginnt mit \relax
. Es gibt immer noch Fälle, in denen etwas schiefgehen könnte, aber im Moment scheint dies die Lösung mit dem „geringsten Risiko“ zu sein. Wie gesagt, es fehlt ein Hinweis darauf, warum dieser Test vorhanden ist: Der Grund ist nicht sofort ersichtlich!