Entfernen Sie Protokollinformationen aus der URL in Biblatex

Entfernen Sie Protokollinformationen aus der URL in Biblatex

Ich möchte meine Bibliographie rationalisieren, indem ich die Protokollinformationen ( http://und https://) aus der gedruckten Version der URL entferne, ohne die Hyperrefs zu beschädigen. Meine Lösung sieht im Moment so aus

\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}

Ich bin mir aber sicher, dass es eine einfachere Lösung geben muss, insbesondere Sourcemaperscheint mir das angesichts dieses Problems übertrieben. Zumindest habe ich noch nicht den einfachsten regulären Ausdruck gefunden.

Antwort1

Ich finde Ihren Ansatz sehr sinnvoll, aber ich würde drei Dinge ändern

  1. Verwenden Sie für den URL-Pfad ein wörtliches Feld ( verba) und kein wörtliches Feld ( userd). Dies ist relevant, wenn die URL gefährliche Zeichen wie #oder enthält %. Wörtliche Felder können diese Zeichen nicht verarbeiten, sofern sie nicht maskiert werden.

  2. Sie können den regulären Ausdruck etwas kürzer machen, indem Sie das übereinstimmende Schema einfach durch nichts ersetzen, anstatt den verbleibenden Pfad zu erfassen.

  3. Verwenden Sie \nolinkurlinnerhalb von \href: \hrefstellt den Link bereits bereit.

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}

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


Ich denke, es ist am besten, die Stringmanipulation Biber zu überlassen (einige Stringmanipulationen sind in TeX sicherlich möglich, aber normalerweise etwas mühsamer als mit Biber). Wenn Sie also die Informationen über das Protokoll (http oder https) beibehalten und nicht einfach alle URLs mit einem fest codierten httpoder verknüpfen möchten https, müssen Sie zwei separate Felder im übergeben .bbl. Die andere Möglichkeit wäre, das Protokollschema und den Pfad separat zu speichern, aber dann müssten Sie die Dinge zusammensetzen, um einen funktionierenden Link zu erhalten, was mehr Arbeit zu sein scheint. Ich denke also, Ihr Ansatz ist ziemlich unkompliziert.


In dieser Situation wäre das wahrscheinlich übertrieben, aber normalerweise finde ich es angenehmer, ein neu deklariertes Feld anstelle des generischen Platzhalters zu verwenden verba. Hier ist also die gleiche Lösung mit einem dedizierten protocollessurlFeld.

\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}

verwandte Informationen