Automatisches Ersetzen von Leerzeichen in Feldern mit Biber und Biblatex

Automatisches Ersetzen von Leerzeichen in Feldern mit Biber und Biblatex

Ich habe eine ziemlich große .bib-Datei, deren Felder Leerzeichen enthalten können (z. B. kann das Feld „Serie“ „SIGMOD '99“ sein). Wenn ich die Bibliographie drucke, werden einige Zeilen an diesen Leerzeichen unterbrochen, was unschön ist. Ich verwende XeLateX mit Biblatex und Biber.

Ich möchte Leerzeichen in diesen Feldern automatisch durch geschützte Leerzeichen ersetzen. Ich habe versucht, zu verwenden DeclareSourcemap, aber es hat nicht funktioniert. Hier ist, was ich geschrieben habe:

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

Dieser Code entfernt tatsächlich die Leerzeichen („SIGMOD '99“ erscheint als „SIGMOD'99“), dasselbe gilt für \nobreakspace. Das Ersetzen ~durch \,erzeugt etwas Ähnliches wie SIGMOD-kern+.1667em elax ’00.

renewbibmacroAuch mit und ist mir nichts gelungen StrSubstitute. Ich habe folgendes verwendetrenewbibmacro

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

Irgendeine Idee?.. Ich bin auch an Anmerkungen zu bewährten Vorgehensweisen interessiert.

Bearbeiten: hier ist ein 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}

Beim Kompilieren sieht man, dass das Leerzeichen im seriesFeld verschwindet und ich möchte es durch ein geschütztes Leerzeichen ersetzen.

Antwort1

Match und Replace verwenden reguläre Ausdrücke und LaTeX erkennt die Eingabe ebenfalls. Es können also lustige Dinge passieren, wenn Sie nicht alle speziellen regulären Ausdrücke und Latex-Eingaben korrekt maskieren. Normalerweise ist es am besten, alles in den \regexpBefehl einzugeben und dann reguläre Ausdrücke zu maskieren (z. B. „ \\nas“ \nist ein Zeilenumbruch).

Sie können diese Quellzuordnung verwenden:

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

Dies führt zu diesem Eintrag im bbl:

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

Dies \x20dient dazu, nach dem Befehl ein wörtliches Leerzeichen zu erhalten, um Probleme zu vermeiden, wenn ein Buchstabe folgt.

Eine Alternative ist

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

aber meiner Meinung nach ist es viel weniger klar.

Das hier ist für die Tilde:

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

Wenn man aber nicht weiß, ob die Tilde in einem regulären Ausdruck ein Sonderzeichen ist, schadet ein zusätzlicher Backslash nicht:

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

verwandte Informationen