“双端”超参考宏:如何使其尽可能自动化?

“双端”超参考宏:如何使其尽可能自动化?

一般来说,对特定对象的引用可以在文档中出现多次。因此,我们无法推断哪个引用将我们引向了所引用的对象。

但是,如果保证引用只出现一次会怎么样呢?在这种情况下,可以想象一个双端超链接:单击链接将带您到另一端,单击另一端将带您回到原始位置。

以下是双向超链接的手动实现:

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

相关内容