Substituição automática de espaços em campos com Biber e Biblatex

Substituição automática de espaços em campos com Biber e Biblatex

Eu tenho um arquivo .bib bem grande cujos campos podem conter espaços (por exemplo, o campo "série" pode ser "SIGMOD '99"). Quando imprimo a bibliografia, algumas linhas ficam quebradas nestes espaços, o que é desagradável. Estou usando o XeLateX com Biblatex e Biber.

Gostaria de substituir automaticamente os espaços por espaços ininterruptos nesses campos. Tentei usar DeclareSourcemap, mas não funcionou. Aqui está o que escrevi:

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

Na verdade, esse código remove os espaços ("SIGMOD '99" aparece como "SIGMOD'99"), o mesmo que \nobreakspace. Substituir ~por \,produz algo parecido com SIGMOD-kern+.1667em elax ’00.

Eu não tive sucesso com renewbibmacroe StrSubstitutetambém. Eu usei o seguinterenewbibmacro

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

Alguma ideia?.. Também estou interessado em comentários sobre boas práticas.

Editar: aqui está um 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}

Ao compilar, você pode ver que o espaço no seriescampo desaparece e quero que ele seja substituído por um espaço ininterrupto.

Responder1

combine e substitua use regex e o LaTeX também está vendo a entrada. coisas tão engraçadas podem acontecer se você não escapar corretamente de todas as entradas especiais de regex e látex. Normalmente é melhor colocar tudo no \regexpcomando e então usar escapes regex (por exemplo, \\ncomo \numa nova linha).

Você pode usar este mapa de origem:

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

Isso dá esta entrada no bbl:

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

Existe \x20para obter um espaço literal após o comando para evitar problemas se uma letra seguir.

Uma alternativa é

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

mas, na minha opinião, é muito menos claro.

Isto aqui é para o til:

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

Mas se você não sabe se o til é um caractere especial em uma regex, uma barra invertida adicional não prejudica:

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

informação relacionada