biblatex:DOI 中包含特殊字符,导致 URL 无效

biblatex:DOI 中包含特殊字符,导致 URL 无效

这个问题与

DOI 中的特殊字符导致 URL 无效

但上述问答中找到的解决方案不适用于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}

相关内容