
Este documento está extraído de un archivo .bbl generado por BibTeX:
\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\newcommand{\showDOI}[1]{\textsc{doi:}#1}
\begin{document}
\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}
\end{document}
Se representa así:
Quiero obtener resultados como si el documento se hubiera leído.
\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\newcommand{\showDOI}[1]{\textsc{doi:}#1}
\begin{document}
\showDOI{\href{https://doi.org/10.1016/j.comnet.2004.08.013}%
{\UrlFont 10.1016/j.comnet.2004.08.013}
\end{document}
es decir
con el hipervínculo del PDF todavía apuntando a la URL completa.
Pero, como no quiero tener que meterme con el archivo .bst, y porque necesito que se expanda el \verb
comportamiento similar a \url
aplicado antes (algunos de los DOI en mi bibliografía actual tienen guiones bajos y/o signos de porcentaje), \showDOI
Quiero lograr esto cambiandosolola definición de \showDOI
, no la forma en que se usa.
es posible? ¿Si es así, cómo?
Respuesta1
El texto plano de una URL creada por \urldef
se puede modificar definiendo \UrlLeft
y \UrlRight
. Adaptado delurl
manual de paquete, usando xstring
para el procesamiento de cadenas:
\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\usepackage{xstring}
\setlength{\parskip}{1em} % for presentation only
\newcommand{\showDOI}[1]{%
\let\oldleft\UrlLeft%
\let\oldright\UrlRight%
\def\UrlLeft##1\UrlRight{\StrGobbleLeft{##1}{16}}%
\textsc{doi:} #1%
\let\UrlLeft\oldleft%
\let\UrlRight\oldright%
}
\begin{document}
\url{http://www.regular-url.com/}
\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}
\url{http://www.other-url.com/}
\end{document}
Esto funciona porque hyperref
primero crea el enlace con el argumento original y luego lo formatea usando el url
paquete, que a su vez usa la definición proporcionada. Tenga en cuenta que las definiciones deben guardarse y restaurarse en la pantalla DOI para evitar el truncamiento de las URL normales.
Resultado (el destino del enlace se muestra como información sobre herramientas):
Respuesta2
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\def\showDOI#1{\expandafter\showDOI@i#1\@nil}
\def\showDOI@i#1//#2/#3\@nil{\textsc{DOI:} \href{#1//#2/#3}{\UrlFont#3}}
\makeatother
\begin{document}
\def\tempurl{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}%
\showDOI{https://doi.org/10.1016/j.comnet.2004.08.013}
\end{document}
Respuesta3
Eliminemos todo lo que viene antes doi.org/
(de modo que incluso si tiene http
en lugar de https
, la macro funcionará igual).
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\showDOI}{m}
{
\textsc{doi:}
%\nobreakspace % if you want a space, uncomment this
\zwol_showdoi:n { #1 }
}
\tl_new:N \l__zwol_showdoi_tl
\tl_new:N \l__zwol_showdoi_full_tl
\cs_new_protected:Nn \zwol_showdoi:n
{
\tl_if_single:nTF { #1 }
{ % single token
\cs_if_exist:cTF { \cs_to_str:N #1 ~ }
{% we assume it is \urldef
\__zwol_showdoi_urldef:c { \cs_to_str:N #1 ~ }
}
{
\tl_set:Nx \l__zwol_showdoi_tl { #1 }
}
}
{
\tl_set:Nn \l__zwol_showdoi_tl { #1 }
}
\tl_set_eq:NN \l__zwol_showdoi_full_tl \l__zwol_showdoi_tl
\regex_replace_once:nnN { \A .*doi\.org/ } { } \l__zwol_showdoi_tl
\href{\l__zwol_showdoi_full_tl}{\UrlFont\l__zwol_showdoi_tl}
}
\cs_new_protected:Nn \__zwol_showdoi_urldef:N
{
\tl_set_eq:NN \l__zwol_showdoi_tl #1
\regex_replace_once:nnN { \c{url} \cB. (.*) \cE. } { \1 } \l__zwol_showdoi_tl
}
\cs_generate_variant:Nn \__zwol_showdoi_urldef:N { c }
\ExplSyntaxOff
\begin{document}
\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}
\showDOI{https://doi.org/10.1016/j.comnet.2004.08.013}
\end{document}
Es posible que necesites actualizar tu distribución TeX, porque las expresiones regulares ingresaron al kernel expl3 recientemente. Si no puedes actualizar, agrega \usepackage{l3regex}
.