biblatex の URL からプロトコル情報を削除する

biblatex の URL からプロトコル情報を削除する

ハイパーリファレンスを壊さずに、URLの印刷版からプロトコル情報(http://およびhttps://)を削除して参考文献を簡素化したいと考えています。現時点での私の解決策は次のようになります。

\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

あなたのアプローチは非常に賢明だと思いますが、3つの点を変えたいと思います

  1. URL パスには、リテラル フィールド ( verba) ではなく、逐語的フィールド ( ) を使用します。これは、URL にや などの危険な文字が含まれている場合に関係します。リテラル フィールドは、エスケープしない限り、これらの文字を処理できません。userd#%

  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、 で 2 つの別々のフィールドを渡す必要があります.bbl。もう 1 つのオプションは、プロトコル スキームとパスを別々に保存することですが、その場合、機能するリンクを取得するためにさまざまなものをつなぎ合わせる必要があり、作業が増えるようです。したがって、あなたのアプローチは非常に簡単だと思います。


この状況ではやりすぎかもしれませんが、通常は汎用プレースホルダーの代わりに新しく宣言されたフィールドを使用する方がよいと思います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}

関連情報