Удалить информацию о протоколе из URL в biblatex

Удалить информацию о протоколе из URL в biblatex

Я хочу оптимизировать свою библиографию, удалив информацию о протоколе ( 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

Я думаю, что ваш подход очень разумен, но я бы изменил три вещи

  1. Используйте дословное поле ( verba), а не буквальное поле ( userd) для пути URL. Это становится актуальным, если URL содержит опасные символы, такие как #или %. Буквальные поля не могут обрабатывать эти символы, если они не экранированы.

  2. Вы можете сделать RegEx немного короче, просто заменив сопоставленную схему ничем вместо того, чтобы захватывать оставшийся путь.

  3. Использовать \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}

DuckDuckGo. DuckDuckGo. URL: duckduckgo.com/_^a#?\u&6%k.//Google. Google. URL: google.com.//Microsoft. Bing. URL: bing.com.


Я думаю, лучше всего оставить манипуляции со строками 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}

Связанный контент