用于编写带有可选链接文本的 DOI 的宏

用于编写带有可选链接文本的 DOI 的宏

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,但在本例中这是无意义的)

我还用一些可用的 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) 上,单击链接不会在浏览器中打开该链接。

相关内容