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 pdflatex
como:
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, biblatex
autor, 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, biblatex
usa uma macro chamada \blx@usqcheck
que é 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@tempb
nã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 biblatex
não nos deixa notas sobre o que esse código deveria fazer, mas acho que ele pretendia permitir o \relax
uso 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 \foo
for uma macro, e não apenas se tiver significado igual a \relax
. (O \noexpand
primitivo é \foo
temporariamente igual a \relax
se 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 french
opçã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 biblatex
segue 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!