Tengo un archivo .bib bastante grande cuyos campos pueden contener espacios (por ejemplo, el campo "serie" puede ser "SIGMOD '99"). Cuando imprimo la bibliografía, algunas líneas están rotas en estos espacios, lo cual es desagradable. Estoy usando XeLateX con Biblatex y Biber.
Me gustaría reemplazar automáticamente los espacios con espacios que no se separen en esos campos. Intenté usarlo DeclareSourcemap
, pero no funcionó. Esto es lo que escribí:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=series,
match={\ }, replace={~}]
}
}
}
En realidad, este código elimina los espacios ("SIGMOD '99" aparece como "SIGMOD'99"), lo mismo con \nobreakspace
. Reemplazar ~
con \,
produce algo parecido a SIGMOD-kern+.1667em elax ’00
.
No tuve éxito con renewbibmacro
y StrSubstitute
tampoco. Usé lo siguienterenewbibmacro
\renewbibmacro*{series+number}{%
\setunit*{\addnbspace}%
\StrSubstitute{\printfield{series}}{ }{~}%
\printfield{number}%
\newunit}
¿Alguna idea?... También me interesan comentarios sobre buenas prácticas.
Editar: aquí hay un 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}
Al compilar, puede ver que el espacio en el series
campo desaparece y quiero reemplazarlo por un espacio que no se rompa.
Respuesta1
hacer coincidir y reemplazar usa expresiones regulares y LaTeX también ve la entrada. Así que pueden suceder cosas divertidas si no escapas correctamente de todas las entradas especiales de expresiones regulares y látex. Normalmente es mejor poner todo en el \regexp
comando y luego usar escapes de expresiones regulares (por ejemplo, \\n
como \n
una nueva línea).
Puedes usar este mapa fuente:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=series,
match={\regexp{\s}}, replace={\regexp{\\nobreakspace\x20}}]
}
}
}
Esto da esta entrada en la bbl:
\field{series}{SIGMOD\nobreakspace '99}
Está \x20
ahí para obtener un espacio literal después del comando para evitar problemas si le sigue una letra.
Una alternativa es
match={\ }, replace={\string\\nobreakspace\string\x20}]
pero en mi humilde opinión es mucho menos claro.
Esto de aquí es para la tilde:
match={\regexp{\s}}, replace={\regexp{~}}]
Pero si no sabes si la tilde es un carácter especial en una expresión regular, una barra invertida adicional no hace daño:
match={\regexp{\s}}, replace={\regexp{\~}}]