Ändern Sie den Standardlink von \ref{} in Hyperref

Ändern Sie den Standardlink von \ref{} in Hyperref

Mein Dokument hat Kapitel und Abschnitte. Wenn ich auf Abschnitte im selben Kapitel verweise, schreibe ich, \ref{section_label}wenn ich auf Abschnitte in einem anderen Kapitel verweise, schreibe ich \ref{chapter_label}.\ref{section_label}. Auf dem Papier hat dies den gewünschten Effekt.

Leider hyperreferzeugen (natürlich) zwei verschiedene Links anstelle von einem. Ersetzen Sie also die letztere Referenz durch

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

Dies erzeugt in einigen Viewern (Okular, Evince) das gewünschte Verhalten, hat jedoch auf andere (PDF.js) keine Auswirkungen.

Ich glaube nicht, dass der obige „Hack“ eine korrekte Verwendung von ist hyperref. Irgendwelche Vorschläge?

Antwort1

Normalerweise wird die Formatierung durch \label(eigentlich \refstepcounter) durchgeführt. Man kann mehrere Beschriftungen verwenden, je nachdem, wie die Referenz aussehen soll. Dies verwendet dasselbe \mylabelMakro wieHier.

Hyperref verwendet seine eigenen Labels, die mit gefunden werden können \getrefbykeydefault. Außerdem \refist geschützt (wird erst erweitert, wenn gedruckt wird). Wenn Sie es also in einem Makro verwenden möchten, müssen Sie \getrefnumberstattdessen verwenden. Siehe Refcount-Handbuch.

Ich habe die Lösung von egreg zum Vergleich eingefügt.

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

verwandte Informationen