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

나는 당신의 접근 방식이 매우 합리적이라고 생각합니다. 하지만 저는 세 가지를 바꾸고 싶습니다.

  1. URL 경로에는 리터럴 필드( verba)가 아닌 축어적 필드( )를 사용하십시오. userdURL에 #또는 같은 위험한 문자가 포함된 경우 이는 관련이 있습니다 %. 리터럴 필드는 이스케이프 처리되지 않는 한 해당 문자를 처리할 수 없습니다.

  2. 나머지 경로를 캡처하는 대신 일치하는 구성표를 아무것도 없는 것으로 바꾸면 RegEx를 약간 더 짧게 만들 수 있습니다.

  3. \nolinkurl내부 사용 \href: \href이미 링크를 제공합니다.

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}

덕덕고. 덕덕고. URL: duckduckgo.com/_^a#?\u&6%k.//Google. Google. URL: google.com.//Microsoft. 빙. 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}

관련 정보