\mkbibquote schließt Anführungszeichen nicht, wenn unmittelbar darauf ein Doppelpunkt folgt

\mkbibquote schließt Anführungszeichen nicht, wenn unmittelbar darauf ein Doppelpunkt folgt

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 lualatexgibt 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, biblatexder 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 biblatexwird 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@tempbkein 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 biblatexhinterlässt keine Hinweise darauf, was dieser Code bewirken sollte, aber ich denke, er wollte die \relaxVerwendung 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\relaxwahr ist, wenn \fooüberhaupt ein Makro ist, und nicht nur, wenn es in der Bedeutung gleich ist mit \relax. (Das \noexpandPrimitiv macht \foovorübergehend gleich mit , \relaxwenn 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 frenchOption 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 biblatexdie „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!

verwandte Informationen