该doi
软件包有一个简洁的\doi
命令,可以将 doi 字符串转换为\href{http://dx.doi.org/<the doi>}{doi:<the doi>}
。该uri
软件包在软件包的帮助下具有类似的功能url
。
我希望有一个该命令的扩展版本,可以将任意链接文本作为可选参数,例如\mydoi[Paper title]{doi}
。我自己尝试了一下,借助这,但奇怪的人物在 DOI 中破坏了这一点。
以 DOI 为例10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H
。我手动检查了一下,它 确实有效,我只想要一个能从或\href{http://dx.doi.org/10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H}{doi:10.1002/(SICI)1097-0037(199712)30:4\textless263::AID-NET4\textgreater3.0.CO;2-H}
生成该序列的宏。\mydoi{10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H}
\mydoi[Title]{10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H}
答案1
运行起来很流畅,不需要转义任何字符。我们的宏\xx@doi
只是对原始宏的修改,\@doi
用于处理可选参数。\x@doi
我们将原始宏存储在其中\@doi
,以便我们可以重新定义\@doi
。
\documentclass{article}
\usepackage{hyperref}
\usepackage{doi}
\makeatletter
\let\x@doi\@doi
\def\@doi{\@ifnextchar[\xx@doi\x@doi}
\def\xx@doi[#1]#2{%
\let\#\relax \let\_\relax \let\textless\relax \let\textgreater\relax
\edef\x{\toks0={{#1}}}\x
\edef\#{\@percentchar 23}\edef\_{_}%
\edef\textless{\@percentchar 3C}\edef\textgreater{\@percentchar 3E}%
\edef\x{\toks1={\noexpand\href{http://dx.doi.org/#2}}}\x
\edef\x{\endgroup\doitext\the\toks1 \the\toks0}\x
}
\makeatother
\begin{document}
\doi{1000.00/01/23/45_153#111<abc>xyz}
\doi[My]{1000.00/01/23/45_153#111<abc>xyz}
\end{document}
答案2
好吧,你可以尝试使用这个ifthen
包,它将第一个参数定义为可选(实际上它设置\empty
为默认值,并且命令根据该默认值显示一个或另一个版本
\documentclass[a4paper,12pt]{scrartcl}
\usepackage{hyperref,ifthen}
\newcommand{\mydoi}[2][\empty]{%
\ifx\empty#1%
\href{http://dx.doi.org/#2}{doi: #2}%
\else%
\href{http://dx.doi.org/#2}{#1}%
\fi%
}%
\begin{document}
Version 1: DOI \mydoi{DOI1}\\
Version 2: Link Text \mydoi[LinkText]{DOI2}
\end{document}
会产生类似
(当然,两个链接都链接到相应的 DOI,但在本例中这是无意义的)
我还用一些可用的 DOI 测试了这一点,尽管我不确定你的“奇怪字符”是什么。对于.
/
诸如此类的情况,这是有效的。
更新 1
OP 要求 DOI 也10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H
应该起作用,并指出,只转义第二个参数是可行的\href
。在代码环境中封装第二个参数会转义所指出的字符,因此一种方法是使用包,listings
如下所示
\documentclass[a4paper,12pt]{scrartcl}
\usepackage{hyperref,url,ifthen,listings}
\newcommand{\mydoi}[2][\empty]{%
\ifx\empty#1%
\href{http://dx.doi.org/#2}{doi: \lstinline!#2!}%
\else%
\href{http://dx.doi.org/#2}{#1}%
\fi%
}%
\begin{document}
\mydoi{10.1002/(SICI)1097-0037(199712)30:4<263::AID-NET4>3.0.CO;2-H}
\end{document}
编译成功。不过,至少在我的系统 (MacTeX 2012) 上,单击链接不会在浏览器中打开该链接。