
Quero agilizar minha bibliografia removendo as informações do protocolo ( http://
e https://
) da versão impressa da URL sem quebrar as hiperrefs. Minha solução no momento é assim
\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}
Mas tenho certeza de que deve haver uma solução mais simples, especialmente o que Sourcemap
me parece um exagero considerando este problema. No mínimo, não criei a expressão regular mais simples.
Responder1
Acho que sua abordagem é muito sensata, mas eu mudaria três coisas
Use um campo literal (
verba
) e não um campo literal (userd
) para o caminho do URL. Isso se torna relevante se o URL contiver caracteres perigosos como#
ou%
. Os campos literais não podem lidar com esses caracteres, a menos que sejam escapados.Você pode tornar o RegEx um pouco mais curto simplesmente substituindo o esquema correspondente por nada, em vez de capturar o caminho restante.
Use
\nolinkurl
inside\href
:\href
já fornece o link.
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}
Eu acho que é melhor deixar a manipulação de strings para o Biber (alguma manipulação de strings é certamente possível no TeX, mas geralmente é um pouco mais dolorosa do que no Biber), então se você quiser reter as informações sobre o protocolo (http ou https) e não deseja apenas vincular todos os URLs com um http
ou codificado https
, você precisa passar dois campos separados no arquivo .bbl
. A outra opção seria salvar o esquema do protocolo e o caminho separadamente, mas então você teria que juntar as peças para obter um link funcional, o que parece mais trabalhoso. Portanto, acho que sua abordagem é bastante direta.
Provavelmente é um exagero nesta situação, mas geralmente acho melhor usar um campo recém-declarado em vez do espaço reservado genérico verba
. Então aqui está a mesma solução com um 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}