Я хочу оптимизировать свою библиографию, удалив информацию о протоколе ( http://
и https://
) из печатной версии URL, не нарушая гиперреф. Мое решение на данный момент выглядит так
\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}
Но я уверен, что должно быть более простое решение, тем более мне Sourcemap
кажется, что это перебор, учитывая эту проблему. По крайней мере, я не придумал простейшего регулярного выражения.
решение1
Я думаю, что ваш подход очень разумен, но я бы изменил три вещи
Используйте дословное поле (
verba
), а не буквальное поле (userd
) для пути URL. Это становится актуальным, если URL содержит опасные символы, такие как#
или%
. Буквальные поля не могут обрабатывать эти символы, если они не экранированы.Вы можете сделать RegEx немного короче, просто заменив сопоставленную схему ничем вместо того, чтобы захватывать оставшийся путь.
Использовать
\nolinkurl
внутри\href
:\href
уже предоставляет ссылку.
МВЭ
\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}
Я думаю, лучше всего оставить манипуляции со строками Biber (некоторые манипуляции со строками, конечно, возможны в TeX, но обычно это немного более болезненно, чем с Biber), поэтому, если вы хотите сохранить информацию о протоколе (http или https) и не просто хотите связать все URL-адреса с жестко закодированным http
или https
, вам нужно передать два отдельных поля в .bbl
. Другой вариант — сохранить схему протокола и путь по отдельности, но тогда вам придется собирать все воедино, чтобы получить работающую ссылку, что кажется более трудоемким. Поэтому я думаю, что ваш подход довольно прост.
Это, возможно, излишне в данной ситуации, но обычно я нахожу более приятным использовать новое объявленное поле вместо универсального заполнителя verba
. Так что вот то же самое решение с выделенным protocollessurl
полем.
\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}