当使用 varioref、hyperref、cleverref 和 nameref 混合时,我们如何超链接整个引用?

当使用 varioref、hyperref、cleverref 和 nameref 混合时,我们如何超链接整个引用?

通过结合使用varioref、和包hyperref,我们可以获得复杂的交叉引用(技术上为“标签”的“引用”),并带有超链接。cleverrefnameref

例如,从如下的最小工作示例(MWE)...

\documentclass{article}

\usepackage{varioref}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\usepackage{nameref}

\newcommand{\smartref}[1]{\nameref{#1} \vref{#1}}

\begin{document}

\pagebreak
\section{The Start}\label{theStartLabel}


\pagebreak
\section{Section Two}\label{sectionTwoLabel}


\pagebreak
\section{Varioref with hyperref and 
cleverref}\label{variorefWithCleverfAndHyperrefLabel}

Varioref with hyperref and 
cleverref:

See \vref{theStartLabel}\\
See \vref{sectionTwoLabel}\\
See \vref{variorefWithCleverfAndHyperrefLabel}\\
See \vref{theEndLabel}\\

Custom command using varioref, hyperref, cleverref and nameref:

See \smartref{theEndLabel}


\pagebreak
\section{The end}\label{theEndLabel}

\end{document}

...我们得到...

在此处输入图片描述

我们如何改变 MWE 以获取命令varioref\vref自定义命令\smartref来将超链接扩展到整个参考。

例如所以我们得到...

...
下一页第 4 节
...
下一页第 4 节结束
...

答案1

一个解决方案是使用包\hyperref[label]{text}中的用户宏hyperref

正在解决的 MWE ...

\documentclass{article}

\usepackage{varioref}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\usepackage{nameref}

% Store \vref in a variable to enable redefining itself.
% Redefine \vref so the hyperlink is extended to the entire
% reference.
\let\vrefpointer\vref
\renewcommand{\vref}[1]{%
  \hyperref[#1]{\vrefpointer{#1}}%
}

% A custom command \smartref with the hyperlink extended to 
% the entire reference. 
% Plus some grammatic sugar (quote marks and comma)
\newcommand{\smartref}[1]{%
  \hyperref[#1]{\cref{#1}, ``\nameref{#1}", \vpageref{#1}}%
}


\begin{document}

\pagebreak
\section{The Start}\label{theStartLabel}


\pagebreak
\section{Section Two}\label{sectionTwoLabel}


\pagebreak
\section{Varioref with hyperref and 
cleverref}\label{variorefWithCleverfAndHyperrefLabel}

Varioref with hyperref and 
cleverref:

See \vref{theStartLabel}\\
See \vref{sectionTwoLabel}\\
See \vref{variorefWithCleverfAndHyperrefLabel}\\
See (\smartref{theEndLabel})\\

Custom command using varioref, hyperref, cleverref and 
nameref:

See \smartref{theEndLabel}\\

\pagebreak
\section{The end}\label{theEndLabel}

\end{document}

... 产生 ... 最小工作示例解决方案输出。

我从中找到了此解决方案https://en.wikibooks.org/wiki/LaTeX/Hyperlinks#.5Chyperref而不是软件包文档。可能存在更优雅的解决方案(例如,公开更多可能的自定义),但这个可行。

Update01:编辑我的自定义 \smartref 命令以包含尾随注释字符(%),以防止恶意空格括住命令输出。

更新 02:编辑了解决方案 MWE,使其具有括号输出,See (\smartref{theEndLabel})\\以便清楚地表明我的自定义 \smartref 命令的端点处没有恶意空格。更改了输出图像以反映。

Update03:将行尾注释字符%改为 \vref renewcommand。

相关内容