El espacio reducido en la bibliografía no funciona con amsmath cargado (estilo biblatex + IEEE)

El espacio reducido en la bibliografía no funciona con amsmath cargado (estilo biblatex + IEEE)

Relacionado conGitHub plk/biblatex número 910.


\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}

ingrese la descripción de la imagen aquí

Aparte del resultado incorrecto, la compilación con MiKTeX finaliza con errores: Missing number, treated as zero. \end, Illegal unit of measure (pt inserted). \end.

¿Alguien puede darnos una idea de qué hacer para permitir el uso de espacios finos ( \,) en títulos bibliográficos en documentos como el ejemplo anterior?

Respuesta1

biblate-ieeese aplica \MakeSentenceCase*a títulos de algunos (pero no todos) tipos de entrada. @articleLos s obtienen la oración del título en mayúsculas y minúsculas, pero @booklos s no, eso explica la observación en los comentarios.

\MakeSentenceCaseEs una macro muy compleja y frágil ya que la manipulación de cadenas es algo complicada en LaTeX. En particular, \MakeSentenceCaserealiza bastantes expansiones e intenta iterar a través de la cadena un carácter a la vez.

El estándar LaTeX se define \,como una macro robusta, pero amsmathdefine

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

lo que significa que \,se puede expandir (una vez) y no es robusto (su expansión es robusta). Esta expansión causa algunos problemas en la maquinaria \MakeSentenceCasey produce el error que ves.

Hay varias formas de solucionar este problema.

  1. Hazlo \,robusto de nuevo. Asunto

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

    después de haber cargado amsmath. (Tenga en cuenta que \renewrobustcmdnecesita etoolbox, que en MWE se carga con biblatex, por lo que esta línea debe aparecer después de cargar ambos amsmathy biblatex).

  2. \protectesto \,en el .bibarchivo (como lo sugieremico en los comentarios)

    @article{A,
      title = {A\protect\,b c},
    }
    
  3. Utilice un comando diferente que todavía esté protegido (como lo sugiereDavid Purton en los comentarios), por ejemplo el equivalente biblatexde .\,\addnbthinspace

    @article{A,
      title = {A\addnbthinspace b c},
    }
    
  4. Siempre puedes "ocultar" partes de la cadena \MakeSentenceCasecon llaves.

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

    Funciona, pero no estoy seguro si lo recomendaría.


Aquí hay un MWE para probar las soluciones sin 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}

información relacionada