朋友们,
我正在尝试编写一个命令,用于为参考书目系统打印适当超链接的 DOI。这是我的第一次尝试
\newcommand{\formatdoi}[1]{\href{http://dx.doi.org/#1}{#1}}
这对于大多数 DOI 来说都很有效。但是,有些 DOI 中含有令人讨厌的非 LaTeX 友好字符,例如_
。事实证明,如果您通过将 转换为_
来破坏 DOI \_
,那么一切都会正常!(甚至 中的 LINK 也是\href
正确的。)
我对这个解决方案不满意,因为这意味着我们必须在 BibTeX 数据库中包含被破坏的 DOI,这可能会让其他用户感到困惑。我想要一个允许我使用合法 DOI 作为输入的解决方案。
好吧,我刚刚了解了这个\detokenize
命令。有了这个,我可以将上面的命令更新为
\newcommand{\formatdoi}[1]{\href{http://dx.doi.org/\detokenize{#1}}{#1}}
这对于超链接部分非常有效;但是,下划线自然会混淆第二个参数的排版。有简单的解决方案吗?我曾想过在这里使用 verbatim 环境,但它似乎不够强大,无法以这种方式在函数中使用。
非常感谢您的帮助。还有一些限制:
- 我想尽量减少包含的包的数量(和复杂性),因为所有这些都发生在日记的样式文件中。
_
将每个转换为一小段代码就足够了\_
;这样的事情容易实现吗?
祝一切顺利,亚历克斯
答案1
除了 Harish 的解决方案之外doi
你可以使用这个包uri
,它使用了包中的工具url
定义一些命令,其中之一是\doi
再次。
但是如果你想保留字体系列,你需要自己定义这个命令。我向你展示了两者。注释掉带有的行\usepackage{uri}
并删除之前的注释符号\DeclareUrlCommand
以查看效果。
\documentclass{article}
\usepackage{hyperref} % loads package "url", provides linking facilities
\usepackage[doipre={DOI:~}]{uri} % loads "url", if not already loaded
%\DeclareUrlCommand\doi{\def\UrlLeft##1\UrlRight{DOI\nobreakspace\href{http://dx.doi.org/##1}{##1}}\urlstyle{rm}} % works only, if "url" is loaded, but not "uri"
\begin{document}
\doi{10.1007/978-3-540-70575-8_10}\\
\doi{10.1002/(SICI)1099-114X(199904)23:5%3C415::AID-ER489%3E3.0.CO;2-7}
\end{document}
请注意,您无法使用选项uri
('doipre' 和 'doipost') 更改字体系列 - 至少在这里,我的电脑死机了。\DeclareUrlCommand
和的语法\urlstyle
在 的文档中进行了描述url
。
更新:添加了 matth 在评论中给出的更奇怪的 DOI。
答案2
-
在我之前的回答中,和之间存在一些混淆_
。好吧,这里有一个解决方案,_
也可以采用。我使用了doi
包。
\documentclass{article}
\usepackage{doi}
\usepackage{hyperref}
\begin{document}
\renewcommand\doitext{Doi: }
\doi{10.1007/978-3-540-70575-8_10}
\end{document}
希望这会有用。