„Doppelendiges“ Hyperref-Makro: Wie kann es möglichst automatisiert werden?

„Doppelendiges“ Hyperref-Makro: Wie kann es möglichst automatisiert werden?

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

verwandte Informationen