하이퍼참조를 손상시키지 않고 인쇄된 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
나는 당신의 접근 방식이 매우 합리적이라고 생각합니다. 하지만 저는 세 가지를 바꾸고 싶습니다.
URL 경로에는 리터럴 필드(
verba
)가 아닌 축어적 필드( )를 사용하십시오.userd
URL에#
또는 같은 위험한 문자가 포함된 경우 이는 관련이 있습니다%
. 리터럴 필드는 이스케이프 처리되지 않는 한 해당 문자를 처리할 수 없습니다.나머지 경로를 캡처하는 대신 일치하는 구성표를 아무것도 없는 것으로 바꾸면 RegEx를 약간 더 짧게 만들 수 있습니다.
\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}
문자열 조작은 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}