У меня довольно большой файл .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{\~}}]