语境:
为了创建 DOI 链接,我定义了一个命令\doi{<enter doi here>}
:
\newcommand{\doi}[1]{\href{http://dx.doi.org/#1}{doi:#1}}
问题:
然而,这与诸如 之类的愚蠢输入™ 相矛盾10.1007/1-84628-249-7{\textunderscore }13
。因为它似乎解释了下划线,但并没有删除花括号:
http://dx.doi.org/10.1007/1-84628-249-7{_}13
如何定义命令
\hrefcleanbefore{http://dx.doi.org/10.1007/1-84628-249-7{\textunderscore }13}{text}
用真正的下划线替换{\textunderscore }
(默认情况下有效)并删除括号,从而得到一个有效的
\href{http://dx.doi.org/10.1007/1-84628-249-7_13}{text}
(欢迎使用或暗示其他软件包)
背景:
我有一个很棒的书目工具,它可以创建我的 .bib 文件,但对我的 doi 字段有愚蠢的转义
doi = {10.1007/1-84628-249-7{\textunderscore }13}
我尝试了不同的预处理 .bib 文件的选项,但它们都缺乏融入构建过程的便利性。如果一个人知道所有低级 TeX 命令,我认为这不是一个复杂的任务,但我的所有测试似乎都较差或与实现相冲突\href
。
梅威瑟:
\documentclass{article}
\usepackage{hyperref}
\newcommand{\doi}[1]{\href{http://dx.doi.org/#1}{doi:#1}}
\begin{document}
DOI not clickable: \doi{10.1007/1-84628-249-7{\textunderscore }13}
HREF with \{\} not clickable: \href{http://dx.doi.org/10.1007/1-84628-249-7{_}13}{doi:10.1007/1-84628-249-7_13}
HREF correct and clickable: \href{http://dx.doi.org/10.1007/1-84628-249-7_13}{doi:10.1007/1-84628-249-7_13}
\end{document}
答案1
可以使用包regexpatch
多次替换宏定义文本内的字符串:
\documentclass{article}
\usepackage{hyperref}
\usepackage{regexpatch}
\newcommand*{\doi}[1]{%
\def\tmpdoi{#1}%
\xpatchcmd*\tmpdoi{{\textunderscore}}{_}{}{}%
\href{http://dx.doi.org/\tmpdoi}{doi:#1}%
}
\begin{document}
DOI is clickable:
\doi{10.1007/1-84628-249-7{\textunderscore}13}
\end{document}