El siguiente registro biblatex (incrustado en un ejemplo mínimo de 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}
se representa incorrectamente pdflatex
como:
Robert Craft, “Stravinsky en su mejor momento como pájaro: Robert Craft desenreda los cuentos que rodean la creación deEl Rossignol,'”Noticias de ópera, 1982, núm. 8, 14-15, 34.
Tenga en cuenta que faltan las comillas de cierre después de Bird-Best.
Sin embargo, con lualatex
, no existe tal problema. La referencia tiene el formato correcto:
Robert Craft, “Stravinsky en su 'mejor pájaro': Robert Craft desenreda las historias que rodean la creación deEl Rossignol"Noticias de ópera, 1982, núm. 8, 14-15, 34.
Probé todas las últimas ramas estables y de desarrollo de biblatex
, incluidas 2.9a y 3.0. ¿El problema probablemente esté relacionado con csquotes
?
PLK, biblatex
autor, y yo ya hemos discutido esto en GitHub (https://github.com/plk/biblatex/issues/259), pero hasta ahora no hemos podido localizar la causa.
Respuesta1
En el caso descrito biblatex
se utiliza una macro llamada \blx@usqcheck
que utiliza para citas de estilo estadounidense con puntuación "en movimiento". Esto verifica con anticipación la puntuación, los espacios, etc., pero también incluye una verificación:
\if\noexpand\@let@token\relax
\blx@usqcheck@i\blx@tempb
\fi
donde \blx@usqcheck@i\blx@tempb
no inserta ninguna comilla de cierre pero la guarda para uso futuro. (Hay un par de ramas internas que comparten el código anterior, por lo que no es inmediatamente obvio).
El autor original de biblatex
no nos deja notas sobre lo que este código debía hacer, pero creo que su objetivo era permitir el \relax
uso explícito para evitar la puntuación en movimiento.
\mkbibquote{some odd text}\relax ,
El problema es que la construcción \if\noexpand\foo\relax
es verdadera si \foo
es una macro, no solo si tiene el mismo significado que \relax
. (La \noexpand
primitiva se vuelve \foo
temporalmente igual a \relax
si es una macro, pero no si dice que ya lo hizo \let\foo=a
).
Eso nos lleva al problema. Cuando pdfTeX está en uso y french
se ha dado la opción para babel
, el carácter :
está "activo" y tiene una definición de macro.incluso si el idioma activo no es el francés. Por lo tanto, la prueba biblatex
va por el "camino equivocado": encuentra una macro después de la cita, piensa que es una relajación y se salta la puntuación de cierre. Eso no sucede con LuaTeX, ya que no utiliza un activo :
para la tipografía francesa, por lo que el problema nunca aparece.
La solución que sugerí es agregar una segunda prueba en el lugar correcto: como un parche breve.
\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
Esto ahora comprueba que elsignificadode la siguiente macro comienza con \relax
. Todavía hay casos que podrían salir mal, pero por el momento ésta parece la solución de "menor riesgo". Como digo, lo que falta es una nota sobre por qué está ahí esta prueba: ¡no es inmediatamente obvio cuál es el razonamiento!