一般来说,对特定对象的引用可以在文档中出现多次。因此,我们无法推断哪个引用将我们引向了所引用的对象。
但是,如果保证引用只出现一次会怎么样呢?在这种情况下,可以想象一个双端超链接:单击链接将带您到另一端,单击另一端将带您回到原始位置。
以下是双向超链接的手动实现:
\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}