\mkbibquote no cierra las comillas si va seguida inmediatamente de dos puntos

\mkbibquote no cierra las comillas si va seguida inmediatamente de dos puntos

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 pdflatexcomo:

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, biblatexautor, 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 biblatexse utiliza una macro llamada \blx@usqcheckque 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@tempbno 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 biblatexno nos deja notas sobre lo que este código debía hacer, pero creo que su objetivo era permitir el \relaxuso explícito para evitar la puntuación en movimiento.

\mkbibquote{some odd text}\relax ,

El problema es que la construcción \if\noexpand\foo\relaxes verdadera si \fooes una macro, no solo si tiene el mismo significado que \relax. (La \noexpandprimitiva se vuelve \footemporalmente igual a \relaxsi 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 frenchse 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 biblatexva 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!

información relacionada