
Generell kann ein Verweis auf ein bestimmtes Objekt mehrfach in einem Dokument vorkommen. Man kann also nicht schlussfolgern, welcher Verweis uns zum referenzierten Objekt geführt hat.
Was aber, wenn eine Referenz garantiert nur einmal erscheint? In einem solchen Fall kann man sich einen Hyperlink mit zwei Enden vorstellen: Wenn Sie auf den Link klicken, gelangen Sie zum anderen Ende, und wenn Sie auf das andere Ende klicken, gelangen Sie zurück zur ursprünglichen Position.
Hier ist eine manuelle Implementierung eines doppelseitigen Hyperlinks:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\hypertarget{alpha}{\hyperlink{beta}{soft}}
kitty,
warm
kitty,
little
ball
of
fur!
Happy
kitty,
sleepy
kitty,
purr
purr
\hypertarget{beta}{\hyperlink{alpha}{purr!}}
\end{document}
Es wäre schön, die manuelle Implementierung in ein möglichst automatisches Makro zu verpacken. Eine einfache Makroimplementierung ist:
\documentclass{article}
\usepackage{hyperref}
\usepackage{xstring}
\newcommand*{\dehref}[4]{%
\IfEqCase{#3}{%
{1}{\hypertarget{#1}{\hyperlink{#2}{#4}}}%
{2}{\hypertarget{#2}{\hyperlink{#1}{#4}}}%
}%
}%
\begin{document}
\dehref{alpha}{beta}{1}{soft}
kitty,
warm
kitty,
little
ball
of
fur!
Happy
kitty,
sleepy
kitty,
purr
purr
\dehref{alpha}{beta}{2}{purr!}
\end{document}
Es hat jedoch mehrere Nachteile:
Es werden keine relevanten Fehler gemeldet, wenn wir Etiketten wiederverwenden
Der Benutzer muss sich 1/2 merken, um die „Richtung“ des Hyperlinks anzugeben
4 Argumente benötigt!
Irgendwelche Ideen, wie man ein solches Makro vereinfachen kann?
Antwort1
Diese Variante verwendet ein Label für beide Enden und ermittelt \@ifundefined
mithilfe von , ob dies das erste oder zweite Vorkommen ist.
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\newcommand{\backlink}[2]% #1 = label, #2 = text
{\@ifundefined{back@#1}%
{\expandafter\xdef\csname back@#1\endcsname{1}%
\hypertarget{back@#1}{\hyperlink{#1}{#2}}}%
{\ifnum\csname back@#1\endcsname>1
\errmessage{backlink #1 already used twice.}%
\else
\expandafter\xdef\csname back@#1\endcsname{2}%
\hypertarget{#1}{\hyperlink{back@#1}{#2}}%
\fi}%
}
\makeatother
\begin{document}
\backlink{alpha}{soft}
kitty,
warm
kitty,
little
ball
of
fur!
Happy
kitty,
sleepy
kitty,
purr
purr
\backlink{alpha}{purr!}
\end{document}