Автоматическая замена пробелов в полях с помощью Biber и Biblatex

Автоматическая замена пробелов в полях с помощью Biber и Biblatex

У меня довольно большой файл .bib, поля которого могут содержать пробелы (например, поле "серия" может быть "SIGMOD '99"). Когда я печатаю библиографию, некоторые строки разрываются на этих пробелах, что неприятно. Я использую XeLateX с Biblatex и Biber.

Я хотел бы автоматически заменить пробелы на неразрывные пробелы в этих полях. Я пробовал использовать DeclareSourcemap, но это не сработало. Вот что я написал:

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

Этот код на самом деле удаляет пробелы ("SIGMOD '99" отображается как "SIGMOD'99"), то же самое с \nobreakspace. Замена ~на \,дает что-то похожее на SIGMOD-kern+.1667em elax ’00.

У меня не получилось ни с тем, renewbibmacroни StrSubstituteс другим. Я использовал следующееrenewbibmacro

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

Есть идеи?.. Мне также интересны замечания о передовой практике.

Редактировать: вот 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}

При компиляции вы видите, что пробел в seriesполе исчезает, а я хочу заменить его на неразрывный пробел.

решение1

сопоставление и замена используют регулярные выражения, и LaTeX тоже видит ввод. так что могут произойти забавные вещи, если вы не экранируете все специальные регулярные выражения и ввод латекса правильно. Обычно лучше всего поместить все в команду, \regexpа затем использовать экранирования регулярных выражений (например, \\nкак \nи новую строку).

Вы можете использовать эту исходную карту:

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

Это дает следующую запись в bbl:

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

Используется \x20для добавления буквального пробела после команды, чтобы избежать проблем, если за ней следует буква.

Альтернативой является

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

но имхо это гораздо менее понятно.

Это для тильды:

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

Но если вы не знаете, является ли тильда специальным символом в регулярном выражении, то дополнительная обратная косая черта не повредит:

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

Связанный контент