изменить ссылку по умолчанию \ref{} в hyperref

изменить ссылку по умолчанию \ref{} в hyperref

В моем документе есть главы и разделы. Когда я ссылаюсь на разделы в той же главе, я пишу, \ref{section_label}когда я ссылаюсь на раздел в другой главе, я пишу \ref{chapter_label}.\ref{section_label}. На бумаге это имеет желаемый эффект.

К сожалению, hyperrefсоздаем (конечно) две разные ссылки вместо одной. Поэтому замените последнюю ссылку на

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

Это обеспечивает желаемое поведение в некоторых средствах просмотра (Okular, Evince), но не оказывает никакого эффекта на другие (PDF.js).

Я не думаю, что «хак» выше — это правильное использование hyperref. Есть какие-нибудь предложения?

решение1

Обычно форматирование выполняется \label(на самом деле \refstepcounter). Можно использовать несколько меток в зависимости от того, как должна выглядеть ссылка. Здесь используется тот же \mylabelмакрос, который используетсяздесь.

Hyperref использует собственные метки, которые можно найти с помощью \getrefbykeydefault. Кроме того, \refзащищен (не будет расширяться до тех пор, пока не будет напечатан), поэтому, если вы хотите использовать его в макросе, вам нужно использовать \getrefnumberвместо этого . См. руководство по refcount.

Я добавил решение Egreg для сравнения.

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

Связанный контент