"이중 종료" 하이퍼 참조 매크로: 이를 최대한 자동으로 만드는 방법은 무엇입니까?

"이중 종료" 하이퍼 참조 매크로: 이를 최대한 자동으로 만드는 방법은 무엇입니까?

일반적으로 특정 개체에 대한 참조는 문서에 여러 번 나타날 수 있습니다. 따라서 어떤 참조가 참조된 객체로 우리를 데려왔는지 추론할 수 없습니다.

하지만 참조가 한 번만 표시되도록 보장된다면 어떻게 될까요? 이러한 경우에는 양방향 하이퍼링크를 상상할 수 있습니다. 링크를 클릭하면 다른 쪽 끝으로 이동하고, 다른 쪽 끝을 클릭하면 원래 위치로 돌아갑니다.

다음은 양방향 하이퍼링크를 수동으로 구현하는 방법입니다.

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

관련 정보