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
.
renewbibmacro
Auch 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 series
Feld 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 \regexp
Befehl einzugeben und dann reguläre Ausdrücke zu maskieren (z. B. „ \\n
as“ \n
ist 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 \x20
dient 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{\~}}]