Sustitución automática de espacios en campos con Biber y Biblatex

Sustitución automática de espacios en campos con Biber y Biblatex

Tengo un archivo .bib bastante grande cuyos campos pueden contener espacios (por ejemplo, el campo "serie" puede ser "SIGMOD '99"). Cuando imprimo la bibliografía, algunas líneas están rotas en estos espacios, lo cual es desagradable. Estoy usando XeLateX con Biblatex y Biber.

Me gustaría reemplazar automáticamente los espacios con espacios que no se separen en esos campos. Intenté usarlo DeclareSourcemap, pero no funcionó. Esto es lo que escribí:

\DeclareSourcemap{ 
  \maps[datatype=bibtex]{
    \map{
       \step[fieldsource=series,
            match={\ }, replace={~}]
      }
  }      
}

En realidad, este código elimina los espacios ("SIGMOD '99" aparece como "SIGMOD'99"), lo mismo con \nobreakspace. Reemplazar ~con \,produce algo parecido a SIGMOD-kern+.1667em elax ’00.

No tuve éxito con renewbibmacroy StrSubstitutetampoco. Usé lo siguienterenewbibmacro

\renewbibmacro*{series+number}{%
  \setunit*{\addnbspace}%
  \StrSubstitute{\printfield{series}}{ }{~}%
  \printfield{number}%
  \newunit}

¿Alguna idea?... También me interesan comentarios sobre buenas prácticas.

Editar: aquí hay un MWE:

\documentclass[10pt]{article}

\usepackage{fontspec}
\usepackage[backend=biber]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=series,
            match={\ }, replace={\nobreakspace}]
      }
  }
}

\begin{filecontents}{bib1.bib}
@article{some:article:1964,
    author   = "Mister Smart",
    title    = {A very difficult narrative of sub-atomic particles in the diary of Louis XIV},
    journal  = {Journal for Advanced Thinking},
    series = {SIGMOD '99},
}
\end{filecontents}
\addbibresource{./bib1.bib}

\begin{document}
Here is an example of text \cite{some:article:1964}.
\printbibliography
\end{document}

Al compilar, puede ver que el espacio en el seriescampo desaparece y quiero reemplazarlo por un espacio que no se rompa.

Respuesta1

hacer coincidir y reemplazar usa expresiones regulares y LaTeX también ve la entrada. Así que pueden suceder cosas divertidas si no escapas correctamente de todas las entradas especiales de expresiones regulares y látex. Normalmente es mejor poner todo en el \regexpcomando y luego usar escapes de expresiones regulares (por ejemplo, \\ncomo \nuna nueva línea).

Puedes usar este mapa fuente:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=series,
            match={\regexp{\s}}, replace={\regexp{\\nobreakspace\x20}}]
      }
  }
}

Esto da esta entrada en la bbl:

\field{series}{SIGMOD\nobreakspace '99}

Está \x20ahí para obtener un espacio literal después del comando para evitar problemas si le sigue una letra.

Una alternativa es

 match={\ }, replace={\string\\nobreakspace\string\x20}]

pero en mi humilde opinión es mucho menos claro.

Esto de aquí es para la tilde:

 match={\regexp{\s}}, replace={\regexp{~}}]

Pero si no sabes si la tilde es un carácter especial en una expresión regular, una barra invertida adicional no hace daño:

match={\regexp{\s}}, replace={\regexp{\~}}]

información relacionada