更改 hyperref 中 \ref{} 的默认链接

更改 hyperref 中 \ref{} 的默认链接

我的文档包含章节和节。当我引用同一章中的节时,我会写;\ref{section_label}当我引用不同章中的节时,我会写\ref{chapter_label}.\ref{section_label}。在纸上,这会产生预期的效果。

不幸的是,hyperref(当然)生成两个不同的链接来代替一个。因此将后者的引用替换为

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

这会在某些查看器(Okular、Evince)中产生所需的行为,但对其他查看器(PDF.js)没有影响。

我认为上面的“hack”不是 的正确用法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}

相关内容