Schreiben Sie \url{https://example.com/path} in \href{https://example.com/path}{path} aus dem Makro um.

Schreiben Sie \url{https://example.com/path} in \href{https://example.com/path}{path} aus dem Makro um.

Dieses Dokument ist aus einer von BibTeX generierten .bbl-Datei ausgeschnitten:

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

Es wird folgendermaßen gerendert:

Bildbeschreibung hier eingeben

Ich möchte eine Ausgabe erhalten, als ob das Dokument gelesen worden wäre

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

dh

Bildbeschreibung hier eingeben

wobei der PDF-Hyperlink immer noch auf die vollständige URL verweist.

Da ich aber nicht mit der .bst-Datei herumspielen möchte und das \verb-ähnliche Verhalten von \urlapplied before \showDOIis expanded brauche (einige der DOIs in meiner aktuellen Bibliographie enthalten Unterstriche und/oder Prozentzeichen), möchte ich dies erreichen, indem ichnurdie Definition von \showDOI, nicht die Art und Weise, wie es verwendet wird.

Ist das möglich? Und wenn ja, wie?

Antwort1

Der reine Text einer von erstellten URL \urldefkann durch Definieren von \UrlLeftund geändert werden \UrlRight. Angepasst an dieurlPakethandbuch, Verwendung xstringfür die Zeichenfolgenverarbeitung:

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

Dies funktioniert, weil hyperrefder Link zuerst mit dem Originalargument erstellt und dann mithilfe des urlPakets formatiert wird, das wiederum die bereitgestellte Definition verwendet. Beachten Sie, dass die Definitionen rund um die DOI-Anzeige gespeichert und wiederhergestellt werden müssen, um das Abschneiden normaler URLs zu vermeiden.

Ergebnis (Linkziel wird als Tooltip angezeigt):

Bildbeschreibung hier eingeben

Antwort2

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

Bildbeschreibung hier eingeben

Antwort3

Entfernen wir alles, was davor kommt doi.org/(also auch wenn Sie zufällig anstelle httpvon haben https, funktioniert das Makro genauso).

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

Bildbeschreibung hier eingeben

Möglicherweise müssen Sie Ihre TeX-Distribution aktualisieren, da Regexes erst vor kurzem in den expl3-Kernel eingedrungen sind. Wenn Sie nicht aktualisieren können, fügen Sie hinzu \usepackage{l3regex}.

verwandte Informationen