没有 \refstepcounter 的 hyperref 目标

没有 \refstepcounter 的 hyperref 目标

我正在尝试使用该包创建文档内部链接hyperref。在链接应指向的位置,我执行以下命令(作为 LaTeX 环境设置的一部分):

\edef\@currentlabel{LABEL}

在此之后,我使用\label{...}创建引用和\ref{...}。该hyperref\ref{...}按预期将 转换为超链接,但链接指向错误的位置(文本中更靠上的位置)。我如何知道hyperref链接应该指向哪里?

我无法使用,\refstepcounter因为我的标签是文本的并且与 LaTeX 计数器无关。

这是一个“最小”(好吧,“较小”)的工作示例来说明该问题:

\documentclass{article}

\usepackage{lipsum}
\usepackage{amsthm}
\usepackage{hyperref}

\newtheorem{theorem}{Theorem}[section]

\makeatletter
\newenvironment{algorithm}[2]%
  {\medbreak
   \edef\@currentlabel{#1}%
   % more stuff here (put entry in table of algorithms, etc.)
   \noindent
   \textbf{Algorithm~\@currentlabel\ (#2)}\hfill\break
   \ignorespaces}%
  {\medbreak}
\makeatother

\begin{document}

\section{Test}

\begin{theorem}
  \lipsum[1]
\end{theorem}

\begin{algorithm}{TEST}{Test Algorithm}\label{alg:TEST}%
  \lipsum[2]
\end{algorithm}

The following link points to the theorem instead of the algorithm: \ref{alg:TEST}.

\end{document}

答案1

您需要在适当的位置设置锚点。当\refstepcounter发出时,此操作会自动完成,但当设置时,您必须手动完成此操作,而\@currentlabel无需计数器的帮助。

可以设置锚点\phantomsection(尽管名字不好)。

\makeatletter
\newenvironment{algorithm}[2]%
  {\medbreak
   \edef\@currentlabel{#1}%
   % more stuff here (put entry in table of algorithms, etc.)
   \noindent\phantomsection % <------------------------ add the anchor
   \textbf{Algorithm~\@currentlabel\ (#2)}\hfill\break
   \ignorespaces}%
  {\medbreak}
\makeatother

答案2

您可以使用包的\hyperlink\hypertarget宏。它们不需要任何计数器、\refstepcounter操作或重新定义\@currentlabel

  • 插入\hypertarget{<anchor name>}{<some text>}位置读者应该跳转。

  • 插入\hyperlink{<anchor name>}{<other text>}一个或多个位置从中读者应该根据指令跳转到文档其他地方指定的位置\hypertarget

一个非常简单的例子:

\documentclass{article}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\begin{document}

\hypertarget{jump_destination}{\textbf{A wonderful tale}}

Once upon a time, \dots

\clearpage

If you want to read a wonderful tale, click \hyperlink{jump_destination}{here}.

\end{document} 

第二页上的“这里”一词将以蓝色显示,单击它将带您到上一页的“一个精彩的故事”一行。

可以有多个指令指向同一个锚点名称,但是对于给定的锚点名称\hyperlink应该只有一个指令。\hypertarget

将这些想法应用到您的测试代码中,它可能看起来像这样:

\documentclass{article}
\usepackage{lipsum,amsthm,hyperref}
\newtheorem{theorem}{Theorem}[section]

\newenvironment{algorithm}[2]%
  {\par\medbreak\noindent
    % more stuff here (put entry in table of algorithms, etc.)
    \hypertarget{#1}{\textbf{Algorithm~#1 (#2)}}%
    \par\noindent\ignorespaces}%
  {\medbreak}

\begin{document}

\section{Test}

\begin{theorem}
  \lipsum[1]
\end{theorem}

\begin{algorithm}{TEST}{Test Algorithm}
  \lipsum[2]
\end{algorithm}

\clearpage
The following link now points to the algorithm: \hyperlink{TEST}{here}.

\end{document}

相关内容