Espaço fino na bibliografia não funciona com amsmath carregado (estilo biblatex + IEEE)

Espaço fino na bibliografia não funciona com amsmath carregado (estilo biblatex + IEEE)

Relacionado aProblema # 910 do GitHub plk / biblatex.


\documentclass{article}

\usepackage{amsmath}

\usepackage[style=ieee]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @Article{A,
        title = {A\,b c},
    }
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}
    Text~\cite{A}.
    \printbibliography
\end{document}

insira a descrição da imagem aqui

Além da saída incorreta, a compilação com MiKTeX termina com erros: Missing number, treated as zero. \end, Illegal unit of measure (pt inserted). \end.

Alguém pode dar uma ideia do que fazer para permitir o uso de espaços finos ( \,) em títulos bibliográficos em documentos como o exemplo acima?

Responder1

biblate-ieeeaplica-se \MakeSentenceCase*a títulos de alguns (mas não todos) tipos de entrada. @articles recebem a frase do título, mas @booknão, isso explica a observação nos comentários.

\MakeSentenceCaseé uma macro muito complexa e frágil, pois a manipulação de strings é um tanto complicada em LaTeX. Em particular, \MakeSentenceCaseexecuta muitas expansões e tenta iterar na string um caractere por vez.

O LaTeX padrão é definido \,como uma macro robusta, mas amsmathdefine

\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}

o que significa que \,pode ser expandido (uma vez) e não é robusto (sua expansão é robusta). Essa expansão causa alguns problemas no maquinário \MakeSentenceCasee produz o erro que você vê.

Existem várias maneiras de contornar esse problema.

  1. Torne-se \,robusto novamente. Emitir

    \renewrobustcmd{\,}{\tmspace+\thinmuskip{.1667em}}
    

    depois de ter carregado amsmath. (Observe que \renewrobustcmdo need etoolbox, que no MWE é carregado por biblatex, portanto esta linha deve vir depois de carregar ambos amsmathe biblatex.)

  2. \protectisso \,no .bibarquivo (como sugerido porMico nos comentários)

    @article{A,
      title = {A\protect\,b c},
    }
    
  3. Use um comando diferente que ainda esteja protegido (como sugerido porDavid Purton nos comentários), por exemplo , equivalente biblatexa .\,\addnbthinspace

    @article{A,
      title = {A\addnbthinspace b c},
    }
    
  4. Você sempre pode 'ocultar' partes da string \MakeSentenceCasecom chaves.

    @article{A,
      title = {A{\,}b c},
    }
    

    funciona, mas não tenho certeza se o recomendaria.


Aqui está um MWE para testar as soluções sem biblatex-ieee.

\documentclass{article}

\usepackage{amsmath}
\usepackage[style=numeric]{biblatex}

\DeclareFieldFormat{titlecase}{\MakeSentenceCase*{#1}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{A,
  title = {A\,b c},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
  Text~\cite{A}.
  \printbibliography
\end{document}

informação relacionada