使用 \hyperlink 将文本链接到具有事先未知的隐式页面锚点的页面

使用 \hyperlink 将文本链接到具有事先未知的隐式页面锚点的页面

hyperref提供命令\hyperlink,语法为:

\hyperlink{name}{text}

在哪里姓名是超文本对象的名称,并且文本用作跳转到定义标记的链接。页面锚点(例如 )page.12也可用作超文本对象。例如,

Click \hyperlink{page.23}{here} to jump to page 23.

这是 Martin Scharrer 提出的解决方案 这个问题

我想使用 将一串文本链接到页面(按页码)\hyperlink,但能够引用隐式页面锚点page.<number>,该锚点的“编号”事先是未知的。也就是说,page在 的参数中使用计数器的值,该值仅在文档的后面设置\hyperlink

这是一个假设的解决方案:

\documentclass{article}

\usepackage[pageanchor]{hyperref} % option is the default anyway

%% Martin Scharrer's patch for hyperref
%% available at https://tex.stackexchange.com/a/19416/9237
\makeatletter
\let\orig@Hy@EveryPageAnchor\Hy@EveryPageAnchor
\def\Hy@EveryPageAnchor{%
    \begingroup
    \hypersetup{pdfview=Fit}%
    \orig@Hy@EveryPageAnchor
    \endgroup
}
\makeatother 

\def\getpageref{???}   % \getpageref extracts the numeric value of \pageref{key}
                       % for use in the first argument of \hyperlink

\begin{document}

See
\hyperlink{page.\getpageref{lkd}}{this page}
for further clarification.

\newpage

This is the linked page.\label{lkd}

\end{document}

我知道如何实现相似的解决方案只需使用\label然后\pageref(或\autopageref),但我有兴趣利用hyperref建议的补丁这里由 Martin 制作,使所有页面锚点都以全页模式显示。(此补丁似乎只适用于\hyperlink。)

答案1

您可以使用常规命令标记要链接到的页面,然后从中\label提取其页码\getpagerefnumberrefcount包中使用它\hyperlink(“普通” LaTeX 宏\pageref在这里不起作用,因为它不可扩展)。

一个小例子:

\documentclass{article}

\usepackage{refcount}
\usepackage[pageanchor]{hyperref}

%% Martin's patch for hyperref
\makeatletter
\let\orig@Hy@EveryPageAnchor\Hy@EveryPageAnchor
\def\Hy@EveryPageAnchor{%
    \begingroup
    \hypersetup{pdfview=Fit}%
    \orig@Hy@EveryPageAnchor
    \endgroup
}
\makeatother 

\begin{document}

See
\hyperlink{page.\getpagerefnumber{mypage}}{this page}
for further clarification.
\clearpage

\dots
\clearpage

This is the linked page.\label{mypage}

\end{document}

答案2

我昨晚尝试了一些事情,但只得到了错误,因为我玩\pageref*。但 diabonas 的回答给了我决定性的提示。所以这是我的解决方案没有 \hyperlink。它使用替代定义,\hyperref{URL}{category}{label}{text}而不是category=“page”。它对于外部资源特别有用(外部 PDFURL当然需要页面锚点,据我所知,它仅适用于 Adob​​e Reader 的浏览器插件版本)。在我的 MWE 中,URL设置为./\jobname.pdf,将转换为本地 PDF 文件。它完全按照 OP 的要求工作。

\documentclass{article}
\usepackage[latin,english]{babel} % needed for "blindtext",
                                  % "english" is the active language
\usepackage{blindtext,lipsum,kantlipsum} % just for the examples

\usepackage{refcount}% from "oberdiek" bundle

\usepackage[%
  colorlinks=true,%
  linkcolor=green,%
%  filecolor=cyan,% it's the default
]{hyperref}

%%% Patch from Martin Scharrer
%%% cf. https://tex.stackexchange.com/a/19416/9237
\makeatletter
\let\orig@Hy@EveryPageAnchor\Hy@EveryPageAnchor
\def\Hy@EveryPageAnchor{%
    \begingroup
    \hypersetup{pdfview=Fit}%
    \orig@Hy@EveryPageAnchor
    \endgroup
}
\makeatother

%%% \mypageref{<label>}{some linked text}
\newcommand{\mypageref}[2]{\hyperref{./\jobname.pdf}{page}{\getpagerefnumber{#1}}{#2}}

\begin{document}

\section{Package \texttt{blindtext}}

\subsection{English blindtext}\label{btext-en}
See also package \hyperref[klipsum]{\ttfamily kantlipsum} on
\mypageref{klipsum}{next page}.

\medskip

\blindtext[1]

\subsection{Latin blindtext}\label{btext-la}
Compare package \hyperref[lipsum]{\ttfamily lipsum} on
\mypageref{lipsum}{page \pageref*{lipsum}}.

\medskip

\begin{otherlanguage}{latin}
\blindtext[1]
\end{otherlanguage}

\newpage

\section{Package \texttt{kantlipsum}}\label{klipsum}
See also package \hyperref[btext-en]{\texttt{blindtext} with English text} on
\mypageref{btext-en}{previous page}.

\medskip

\kant[1]

\section{Package \texttt{lipsum}}\label{lipsum}
Compare package \hyperref[btext-la]{\texttt{blindtext} with pseudo-Latin text} on
\mypageref{btext-la}{page \pageref*{btext-la}}.

\medskip

\begin{otherlanguage}{latin}
\lipsum[1]
\end{otherlanguage}

\end{document}

MWE 很高兴从我自己那里偷来的:在单个 pdf 文件中以不同方式表示超链接

相关内容