\mkbibquote não fecha aspas se for imediatamente seguido por dois pontos

\mkbibquote não fecha aspas se for imediatamente seguido por dois pontos

O seguinte registro biblatex (incorporado em um exemplo 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}

é renderizado incorretamente por pdflatexcomo:

Robert Craft, “Stravinsky em seu melhor pássaro: Robert Craft desvenda os contos que cercam a criação deLe Rossignol,'”Notícias da Ópera, 1982, não. 8, 14–15, 34.

Observe que falta a aspa de fechamento após Bird-Best.

Com lualatex, no entanto, não existe esse problema. A referência está formatada corretamente:

Robert Craft, “Stravinsky em seu 'Bird-Best': Robert Craft desvenda os contos que cercam a criação deLe Rossignol”,Notícias da Ópera, 1982, não. 8, 14–15, 34.

Eu tentei todas as versões estáveis ​​e de desenvolvimento mais recentes do biblatex, incluindo 2.9a e 3.0. O problema provavelmente está relacionado a csquotes?

PLK, biblatexautor, e eu já discutimos isso no GitHub (https://github.com/plk/biblatex/issues/259), mas até agora não conseguimos rastrear a causa.

Responder1

No caso descrito, biblatexusa uma macro chamada \blx@usqcheckque é usada para citações no estilo americano com pontuação 'móvel'. Isso verifica antecipadamente pontuação, espaços e assim por diante, mas também inclui uma verificação:

\if\noexpand\@let@token\relax
  \blx@usqcheck@i\blx@tempb
\fi

onde o \blx@usqcheck@i\blx@tempbnão insere nenhuma aspa de fechamento, mas salva para uso futuro. (Existem algumas ramificações internas que compartilham o código acima, portanto, não é imediatamente óbvio.)

O autor original de biblatexnão nos deixa notas sobre o que esse código deveria fazer, mas acho que ele pretendia permitir o \relaxuso de um explícito para evitar a movimentação da pontuação

\mkbibquote{some odd text}\relax ,

O problema é que a construção \if\noexpand\foo\relaxé verdadeira se \foofor uma macro, e não apenas se tiver significado igual a \relax. (O \noexpandprimitivo é \footemporariamente igual a \relaxse for uma macro, mas não se você disser que fez \let\foo=a.)

Isso nos leva ao problema. Quando o pdfTeX está em uso e a frenchopção foi dada para babel, o caractere :fica 'ativo' e possui uma definição de macromesmo que a língua ativa não seja o francês. Assim, o teste biblatexsegue o 'caminho errado': encontra uma macro após a citação, pensa que é um relaxamento e pula a pontuação de fechamento. Isso não acontece com o LuaTeX, pois ele não usa ativo :para tipografia francesa, então o problema nunca aparece.

A correção que sugeri é adicionar um segundo teste no lugar certo: como um patch curto

\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

Isso agora verifica se osignificadoda macro a seguir começa com \relax. Ainda há casos que podem dar errado, mas no momento esta parece ser a solução de “menor risco”. Como eu disse, o que falta é uma nota sobre por que esse teste existe: não é imediatamente óbvio qual é o raciocínio!

informação relacionada