altere o link padrão de \ref{} no hyperref

altere o link padrão de \ref{} no hyperref

Meu documento tem capítulos e seções. Quando me refiro a seções do mesmo capítulo, escrevo; \ref{section_label}quando me refiro a seções de um capítulo diferente, escrevo \ref{chapter_label}.\ref{section_label}. No papel, isso tem o efeito desejado.

Infelizmente, hyperrefproduza (é claro) dois links diferentes no lugar de um. Portanto, substitua a última referência por

\hyperref[section_label]{\ref{chapter_label}.\ref{section_label}}

Isto produz o comportamento desejado em alguns visualizadores (Okular, Evince), mas não tem efeito em outros (PDF.js).

Não acho que o 'hack' acima seja um uso correto de hyperref. Alguma sugestão?

Responder1

Normalmente a formatação é feita por \label(na verdade \refstepcounter). Pode-se usar vários rótulos dependendo de como se deseja que a referência seja. Isso usa a mesma \mylabelmacro usadaaqui.

O Hyperref usa seus próprios rótulos que podem ser encontrados usando \getrefbykeydefault. Além disso, \refé protegido (não será expandido até ser impresso), portanto, se quiser usá-lo em uma macro, você precisará usá-lo \getrefnumber. Consulte o manual de recontagem.

Eu adicionei a solução do egreg para comparação.

\documentclass{report}
\usepackage{hyperref}

\renewcommand{\thesection}{\arabic{section}}% non-standard definition

\makeatletter
\@ifpackageloaded{hyperref}%
  {\newcommand{\mylabel}[2]% #1=name, #2 = contents
    {\protected@write\@auxout{}{\string\newlabel{#1}{{#2}{\thepage}%
      {\@currentlabelname}{\@currentHref}{}}}}}%
  {\newcommand{\mylabel}[2]% #1=name, #2 = contents
    {\protected@write\@auxout{}{\string\newlabel{#1}{{#2}{\thepage}}}}}
\makeatother

\newcommand{\getrefanchor}[1]% #1 = label
  {\getrefbykeydefault{#1}{anchor}{Doc-Start}}

\begin{document}

One can use \ref*{chapter}.\ref{section}, \ref{mylabel} or 
\hyperlink{\getrefanchor{section}}{\getrefnumber{chapter}.\getrefnumber{section}}.

\chapter{chapter}\label{chapter}
\section{dummy}
\section{section}\label{section}\mylabel{mylabel}{\thechapter.\thesection}%
\end{document}

informação relacionada