alvos hyperref sem \refstepcounter

alvos hyperref sem \refstepcounter

Estou tentando criar um link interno do documento usando o hyperrefpacote. Na posição para onde o link deve apontar, executo o seguinte comando (como parte da configuração de um ambiente LaTeX):

\edef\@currentlabel{LABEL}

Depois disso, uso \label{...}para criar uma referência e o arquivo \ref{...}. O hyperrefpacote transforma o \ref{...}em um hiperlink conforme esperado, mas o link aponta para o local errado (mais acima no texto). Como posso saber hyperrefpara onde o link deve apontar?

Não posso usar \refstepcounterporque meus rótulos são textuais e não estão associados a um contador LaTeX.

Aqui está um exemplo de trabalho "mínimo" (bem, "pequeno") para ilustrar o problema:

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

Responder1

Você precisa definir uma âncora no local apropriado. Isso é feito automaticamente quando \refstepcounteré emitido, mas você deve fazê-lo manualmente quando \@currentlabelé definido, sem a ajuda de um contador.

Uma âncora pode ser definida \phantomsection(embora seja um nome ruim).

\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

Responder2

Você poderia usar os pacotes \hyperlinke \hypertargetmacros. Eles não exigem contadores, \refstepcounterações ou redefinições de \@currentlabel.

  • Inserir \hypertarget{<anchor name>}{<some text>}no localao qualo leitor deve pular.

  • Inserir \hyperlink{<anchor name>}{<other text>}em um ou mais locaisdo qualo leitor deve ir para o local especificado em outra parte do documento por uma \hypertargetinstrução.

Um exemplo muito simples:

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

A palavra “aqui” na segunda página será mostrada em azul, e clicar nela o levará para a linha “Um conto maravilhoso” na página anterior.

É possível ter múltiplas \hyperlinkinstruções apontando para o mesmo nome de âncora, mas deve haver apenas uma \hypertargetinstrução para um determinado nome de âncora.

Adaptando essas ideias ao seu código de teste, ficaria assim:

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

informação relacionada