“雙端”超引用巨集:如何使其盡可能自動?

“雙端”超引用巨集:如何使其盡可能自動?

一般來說,對特定物件的引用可以在文件中出現多次。因此,我們無法推斷哪個引用將我們帶到了所引用的物件。

但是如果保證引用只出現一次怎麼辦?在這種情況下,可以想像一個雙端超連結:點擊該連結將帶您到另一端,點擊另一端將帶您回到原始位置。

這是雙端超連結的手動實現:

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

相關內容