我想透過從 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 包含危險字元(如#
或 ) ,這一點就變得相關%
。文字字段無法處理這些字符,除非它們被轉義。您可以透過簡單地將匹配方案替換為空而不是捕獲剩餘路徑來使正規表示式稍微短一些。
使用
\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}
我認為最好將字串操作留給 Biber(TeX 中當然可以進行一些字串操作,但通常比 Biber 更痛苦),因此如果您想保留有關協議(http 或 https)的資訊並且不只是想用硬編碼的http
or連結所有 URL 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}