「両端」ハイパー参照マクロ: できるだけ自動化するにはどうすればよいでしょうか?

「両端」ハイパー参照マクロ: できるだけ自動化するにはどうすればよいでしょうか?

一般に、特定のオブジェクトへの参照はドキュメント内で複数回出現する可能性があります。そのため、どの参照が参照先のオブジェクトに導いたかを推測することはできません。

しかし、参照が 1 回だけ表示されることが保証されている場合はどうでしょうか。このような場合、両端にハイパーリンクがあると考えられます。リンクをクリックすると、もう一方の端に移動し、もう一方の端をクリックすると、元の位置に戻ります。

両端ハイパーリンクの手動実装を次に示します。

\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

このバリアントは、両端に 1 つのラベルを使用し、 を使用して、\@ifundefinedこれが最初の発生か 2 番目の発生かを判断します。

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

関連情報