
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:
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
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 \url
applied before \showDOI
is 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 \urldef
kann durch Definieren von \UrlLeft
und geändert werden \UrlRight
. Angepasst an dieurl
Pakethandbuch, Verwendung xstring
fü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 hyperref
der Link zuerst mit dem Originalargument erstellt und dann mithilfe des url
Pakets 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):
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}
Antwort3
Entfernen wir alles, was davor kommt doi.org/
(also auch wenn Sie zufällig anstelle http
von 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}
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}
.