我有一个相当大的 .bib 文件,其中的字段可能包含空格(例如,“series”字段可以是“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{\~}}]