Eu tenho um arquivo .bib bem grande cujos campos podem conter espaços (por exemplo, o campo "série" pode ser "SIGMOD '99"). Quando imprimo a bibliografia, algumas linhas ficam quebradas nestes espaços, o que é desagradável. Estou usando o XeLateX com Biblatex e Biber.
Gostaria de substituir automaticamente os espaços por espaços ininterruptos nesses campos. Tentei usar DeclareSourcemap
, mas não funcionou. Aqui está o que escrevi:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=series,
match={\ }, replace={~}]
}
}
}
Na verdade, esse código remove os espaços ("SIGMOD '99" aparece como "SIGMOD'99"), o mesmo que \nobreakspace
. Substituir ~
por \,
produz algo parecido com SIGMOD-kern+.1667em elax ’00
.
Eu não tive sucesso com renewbibmacro
e StrSubstitute
também. Eu usei o seguinterenewbibmacro
\renewbibmacro*{series+number}{%
\setunit*{\addnbspace}%
\StrSubstitute{\printfield{series}}{ }{~}%
\printfield{number}%
\newunit}
Alguma ideia?.. Também estou interessado em comentários sobre boas práticas.
Editar: aqui está um 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}
Ao compilar, você pode ver que o espaço no series
campo desaparece e quero que ele seja substituído por um espaço ininterrupto.
Responder1
combine e substitua use regex e o LaTeX também está vendo a entrada. coisas tão engraçadas podem acontecer se você não escapar corretamente de todas as entradas especiais de regex e látex. Normalmente é melhor colocar tudo no \regexp
comando e então usar escapes regex (por exemplo, \\n
como \n
uma nova linha).
Você pode usar este mapa de origem:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=series,
match={\regexp{\s}}, replace={\regexp{\\nobreakspace\x20}}]
}
}
}
Isso dá esta entrada no bbl:
\field{series}{SIGMOD\nobreakspace '99}
Existe \x20
para obter um espaço literal após o comando para evitar problemas se uma letra seguir.
Uma alternativa é
match={\ }, replace={\string\\nobreakspace\string\x20}]
mas, na minha opinião, é muito menos claro.
Isto aqui é para o til:
match={\regexp{\s}}, replace={\regexp{~}}]
Mas se você não sabe se o til é um caractere especial em uma regex, uma barra invertida adicional não prejudica:
match={\regexp{\s}}, replace={\regexp{\~}}]