
일반적으로 특정 개체에 대한 참조는 문서에 여러 번 나타날 수 있습니다. 따라서 어떤 참조가 참조된 객체로 우리를 데려왔는지 추론할 수 없습니다.
하지만 참조가 한 번만 표시되도록 보장된다면 어떻게 될까요? 이러한 경우에는 양방향 하이퍼링크를 상상할 수 있습니다. 링크를 클릭하면 다른 쪽 끝으로 이동하고, 다른 쪽 끝을 클릭하면 원래 위치로 돌아갑니다.
다음은 양방향 하이퍼링크를 수동으로 구현하는 방법입니다.
\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}
수동 구현을 가능한 한 자동 매크로로 래핑하는 것이 좋을 것입니다. 간단한 매크로 구현은 다음과 같습니다:
\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}
그러나 여기에는 몇 가지 단점이 있습니다.
라벨을 재사용하면 관련 오류가 발생하지 않습니다.
사용자는 하이퍼링크의 "방향"을 나타내기 위해 1/2을 기억해야 합니다.
4개의 인수가 필요합니다!
그러한 매크로를 어떻게 단순화할 수 있는지에 대한 아이디어가 있습니까?
답변1
이 변형은 양쪽 끝에 하나의 레이블을 사용하고 \@ifundefined
이것이 첫 번째 발생인지 두 번째 발생인지 확인하는 데 사용됩니다.
\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}