Reescribe \url{https://example.com/path} a \href{https://example.com/path}{path} desde la macro

Reescribe \url{https://example.com/path} a \href{https://example.com/path}{path} desde la macro

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í:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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 \verbcomportamiento similar a \urlaplicado antes (algunos de los DOI en mi bibliografía actual tienen guiones bajos y/o signos de porcentaje), \showDOIQuiero 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 \urldefse puede modificar definiendo \UrlLefty \UrlRight. Adaptado delurlmanual de paquete, usando xstringpara 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 hyperrefprimero crea el enlace con el argumento original y luego lo formatea usando el urlpaquete, 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):

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

Respuesta3

Eliminemos todo lo que viene antes doi.org/(de modo que incluso si tiene httpen 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}

ingrese la descripción de la imagen aquí

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}.

información relacionada