这个问题与
但上述问答中找到的解决方案不适用于biblatex-chicago
。
具体来说,我必须处理带有特殊字符的 DOI:例如,
10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2
但是,与该 DOI 直接对应的 URL
https://doi.org/10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2
包含无效字符作为 URL。如何设置才能使此类 DOI 在转换为 URL 时得到正确编码?
上述问答中找到的解决方案是使用包doi
和
\doi{10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}
因此,解决方案很简单:只需\usepackage{doi}
。此解决方案以传统的 LaTeX + BibTeX 方式工作,因为 bib 样式倾向于使用宏\doi
。
但是,如以下代码所示,此方法不适用于biblatex-chicago
。它生成的超链接仍然包含无效的 URL,某些 PDF 查看器(如 Mac 的 Preview)无法处理这些 URL。下面的代码还表明宏\doi
本身可以生成正确编码的 URL。显然,biblatex-chicago
不使用该\doi
命令。
\documentclass[11pt]{article}
\usepackage[doi=only]{biblatex-chicago}
\usepackage{doi}
\begin{filecontents}[overwrite,noheader]{tmp.bib}
@article{ref-with-odd-doi,
title = {Coastal Trapped Waves in a Stratified Ocean},
author = {Allen, J. S.},
year = {1975},
journal = {J. Phys. Oceanogr.},
volume = {5},
pages = {300--325},
doi = {10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}
}
@article{ref-with-nice-doi,
title = {Something},
author = {Some Author},
year = {1975},
journal = {Some Journal},
volume = {5},
pages = {300--325},
doi = {10.1016/j.dsr.2003.09.011}
}
\end{filecontents}
\bibliography{tmp}
\begin{document}
\noindent
\cite{ref-with-odd-doi}\\
\cite{ref-with-nice-doi}\\
\doi{10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}\\
\doi{10.1016/j.dsr.2003.09.011}\\
\printbibliography
\end{document}
答案1
我认为最好的办法是,如果 biber 能够像 url 一样处理 doi,并直接对它们进行百分比编码。但您也可以替换有问题的字符:
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[doi=only]{biblatex-chicago}
\usepackage{doi}
\ExplSyntaxOn
\cs_new_protected:Npn \printdoi#1
{
\tl_set:Nn \l_tmpa_tl{#1}
\tl_replace_all:Nnn\l_tmpa_tl {<}{\c_percent_str3C}
\tl_replace_all:Nnn\l_tmpa_tl {>}{\c_percent_str3E}
% expands with more if needed ...
\href{\doiurl\l_tmpa_tl}{\nolinkurl{#1}}
}
\ExplSyntaxOff
\DeclareFieldFormat{doi}{\printdoi{#1}}
\begin{filecontents}[overwrite,noheader]{tmp.bib}
@article{ref-with-odd-doi,
title = {Coastal Trapped Waves in a Stratified Ocean},
author = {Allen, J. S.},
year = {1975},
journal = {J. Phys. Oceanogr.},
volume = {5},
pages = {300--325},
doi = {10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}
}
@article{ref-with-nice-doi,
title = {Something},
author = {Some Author},
year = {1975},
journal = {Some Journal},
volume = {5},
pages = {300--325},
doi = {10.1016/j.dsr.2003.09.011}
}
\end{filecontents}
\bibliography{tmp}
\begin{document}
%\noindent
\cite{ref-with-odd-doi}\\
\cite{ref-with-nice-doi}
\doi{10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}\\
\doi{10.1175/1520-0485(1975)005<0300:CTWIAS>2.0.CO;2}
\printbibliography
\end{document}