
Estou tentando criar um link interno do documento usando o hyperref
pacote. 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 hyperref
pacote transforma o \ref{...}
em um hiperlink conforme esperado, mas o link aponta para o local errado (mais acima no texto). Como posso saber hyperref
para onde o link deve apontar?
Não posso usar \refstepcounter
porque 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 \hyperlink
e \hypertarget
macros. Eles não exigem contadores, \refstepcounter
açõ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\hypertarget
instruçã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 \hyperlink
instruções apontando para o mesmo nome de âncora, mas deve haver apenas uma \hypertarget
instruçã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}