Quiero optimizar mi bibliografía eliminando la información del protocolo ( http://
y https://
) de la versión impresa de la URL sin romper las hiperreferencias. Mi solución en este momento se ve así
\documentclass{article}
\begin{filecontents}{bibliography.bib}
@misc{key1,
author="Google",
title="Google",
url="https://google.com",
}
@misc{key2,
author="Microsoft",
title="Bing",
url="http://bing.com",
}
@misc{key3,
author="DuckDuckGo",
title="DuckDuckGo",
url="https://duckduckgo.com",
}
\end{filecontents}
\usepackage{hyperref}
\usepackage{biblatex}
\DeclareSourcemap{%
\maps[datatype=bibtex,overwrite=true]{%
\map{
\step[fieldsource=url, final=true]
\step[fieldset=userd, origfieldval,final=true]
\step[fieldsource=userd, match=\regexp{\A(ht|f)tp(s)?:\/\/([^/]+)},replace=\regexp{$3}]
}
}%
}
\DeclareFieldFormat{url}{\mkbibacro{URL}\addcolon\space\href{#1}{\url{\thefield{userd}}}}
\bibliography{bibliography}
\nocite{*}
\begin{document}
\printbibliography
\end{document}
Pero estoy seguro de que debe haber una solución más sencilla, especialmente la que Sourcemap
me parece excesiva teniendo en cuenta este problema. Al menos no se me ocurrió la expresión regular más simple.
Respuesta1
Creo que tu planteamiento es muy sensato, pero cambiaría tres cosas
Utilice un campo literal (
verba
) y no un campo literal (userd
) para la ruta URL. Esto se vuelve relevante si la URL contiene caracteres peligrosos como#
o%
. Los campos literales no pueden tratar con esos caracteres a menos que se les escape.Puede acortar ligeramente la expresión regular simplemente reemplazando el esquema coincidente con nada en lugar de capturar la ruta restante.
Usar
\nolinkurl
dentro\href
:\href
ya proporciona el enlace.
MWE
\documentclass{article}
\usepackage{biblatex}
\usepackage{hyperref}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=url, final=true]
\step[fieldset=verba, origfieldval, final=true]
\step[fieldsource=verba, match=\regexp{\A(ht|f)tp(s)?:\/\/}, replace={}]
}
}
}
\DeclareFieldFormat{url}{%
\mkbibacro{URL}\addcolon\space
\href{#1}{\nolinkurl{\thefield{verba}}}}
\begin{filecontents}{\jobname.bib}
@misc{key1,
author = {Google},
title = {Google},
url = {https://google.com},
}
@misc{key2,
author = {Microsoft},
title = {Bing},
url = {http://bing.com},
}
@misc{key3,
author = {DuckDuckGo},
title = {DuckDuckGo},
url = {https://duckduckgo.com/_^a#?\u&6%k},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}
\begin{document}
\printbibliography
\end{document}
Creo que es mejor dejar la manipulación de cadenas a Biber (ciertamente es posible cierta manipulación de cadenas en TeX, pero generalmente es un poco más doloroso que con Biber), así que si desea conservar la información sobre el protocolo (http o https) y no solo desea vincular todas las URL con un código http
o https
, debe pasar dos campos separados en el archivo .bbl
. La otra opción sería guardar el esquema del protocolo y la ruta por separado, pero luego tendría que unir las cosas para obtener un enlace que funcione, lo que parece más trabajo. Entonces creo que su enfoque es bastante sencillo.
Probablemente sea excesivo en esta situación, pero normalmente me parece mejor usar un campo recién declarado en lugar del marcador de posición genérico verba
. Aquí tienes la misma solución con un protocollessurl
campo dedicado.
\documentclass{article}
\begin{filecontents}{protocollessurl.dbx}
\DeclareDatamodelFields[type=field, datatype=uri]{protocollessurl}
\DeclareDatamodelEntryfields{protocollessurl}
\end{filecontents}
\usepackage[datamodel=protocollessurl]{biblatex}
\usepackage{hyperref}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=url, final=true]
\step[fieldset=protocollessurl, origfieldval, final=true]
\step[fieldsource=protocollessurl, match=\regexp{\A(ht|f)tp(s)?:\/\/}, replace={}]
}
}
}
\DeclareFieldFormat{url}{%
\mkbibacro{URL}\addcolon\space
\href{#1}{\nolinkurl{\thefield{protocollessurl}}}}
\begin{filecontents}{\jobname.bib}
@misc{key1,
author = {Google},
title = {Google},
url = {https://google.com},
}
@misc{key2,
author = {Microsoft},
title = {Bing},
url = {http://bing.com},
}
@misc{key3,
author = {DuckDuckGo},
title = {DuckDuckGo},
url = {https://duckduckgo.com/_^a#?\u&6%k},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}
\begin{document}
\printbibliography
\end{document}