Hyperref 引用文本中的章节和页面

Hyperref 引用文本中的章节和页面
\documentclass[oneside,10pt]{book}
\usepackage{amsmath, amsfonts, amsthm, amssymb}
\usepackage{hyperref}
\usepackage{blindtext}

\begin{document}
\chapter{something}
    \blindtext[1]

\chapter{something else}
\section{a section}
    This is the most important equation in this chapter
    \begin{equation}\label{important-equation}
        1=1
    \end{equation}

\chapter{chapter 3}
    As we have seen in Equation \ref{important-equation} in Chapter (REF-chapter-of-equation) on page (REF-page-of-equation), we have something important
\end{document}

我想要实现的是能够自动替换(并链接)输出中的正确章节和正确的页面,而不是(REF-chapter-of-equation)(REF-page-of-equation)

figure我显然也想在其他环境( s,theorems, s)中做到这一点definition,而不仅仅是方程式。

最后显而易见的是,我想避免“手动链接章节”,因为如果我在开头添加一个章节,或者更糟糕的是,如果我将等式移动到另一个章节,那么我将不得不重新列举所有内容,这看起来是一个非常糟糕的举动。

我已经看过hyperref手册,但没有取得太大的成功。

我不知道这是否相关,我在 Ubuntu 机器上使用 TeXLive 2015 上的 pdfLaTeX。解决方案必须与amsmath

任何有关如何实现这一目标的帮助,都将不胜感激:)

答案1

一种选择是更新\chapter并插入常规\label。当然,结构应该是您不会在文档其他地方使用的结构,因为\labels 必须是唯一的。我选择插入\label{chapter-\thechapter},这类似于\label{chapter-2}第 2 章中的 if \thechapteris \arabic{chapter}(默认值)。

为了插入这个标签,我们重新定义\chapter并使用一些refcount从默认方程编号中提取它 - ( \thechapter.\arabic{equation}) 在\chapref

在此处输入图片描述

\documentclass[oneside]{book}
\usepackage{amsmath,hyperref,refcount}
\usepackage{blindtext}

\AtBeginDocument{
  \let\oldchapter\chapter
  \renewcommand{\chapter}[1]{%
    \clearpage
    \oldchapter{#1}% Regular chapter
    \label{chapter-\thechapter}% \label this chapter
  }
}

\makeatletter
\def\extract@chapter#1.#2\@nil{#1}%
\newcommand{\chapref}[1]{{%
  \edef\x{\noexpand\edef\noexpand\chapnum{\noexpand\extract@chapter\getrefnumber{#1}\noexpand\@nil}}\x%
  \ref{chapter-\chapnum}%
}}
\makeatother

\begin{document}

\chapter{something}
\blindtext[1]

\chapter{something else}
\section{a section}
This is the most important equation in this chapter
\begin{equation}
  1=1 \label{eq:important-equation}
\end{equation}

\chapter{chapter 3}
As we have seen in Equation~\eqref{eq:important-equation} in Chapter~\chapref{eq:important-equation} on page~\pageref{eq:important-equation}, we have something important
\end{document}

上述解决方案假设您只使用编号章节。但是,如果您还使用未编号章节,则可以使用以下重新定义\chapter

\usepackage{xparse}
\AtBeginDocument{
  \let\oldchapter\chapter
  \RenewDocumentCommand{\chapter}{s o m}{%
    \clearpage
    \IfBooleanTF{#1}
      {\oldchapter*{#3}}% \chapter*[..]{...}
      {\IfValueTF{#2}
         {\oldchapter[#2]{#3}}% \chapter[..]{...}
         {\oldchapter{#3}}% \chapter{...}
       \label{chapter-\thechapter}% \label this chapter
      }%
  }
}

唯一的区别在于是否使用\chapter\chapter*以及有条件地放置\label


另一种解决方案与amsmathzref\ref是一个简单的选项,因为它允许用户通过“属性”指定多个单个值。

下面我创建了一个新属性chapter,用于存储\thechapter。此外,每个\chapter命令都已重新定义以插入一个,\label以允许适当的超链接。最后,\label还更新了用于存储其所用的当前章节。

如果您只是想要章节编号,而不是章节开头的超链接,那么就不需要重新定义\chapter(...生活会更轻松)。

在此处输入图片描述

\documentclass[oneside]{book}
\usepackage{zref,hyperref}
\usepackage{blindtext}

\makeatletter
\zref@newprop{chapter}{\thechapter}% Chapter property holds \thechapter

\AtBeginDocument{%
  \let\oldlabel\label
  \renewcommand{\label}[1]{%
    \zref@labelbyprops{#1}{chapter}% Special label
    \oldlabel{#1}% Old label
  }%
}

\let\oldchapter\chapter
\renewcommand{\chapter}[1]{%
  \clearpage
  \oldchapter{#1}% Regular chapter
  \oldlabel{chapter-\thechapter}% \label this chapter
}
\newcommand{\chapref}[1]{%
  \begingroup\edef\x{\endgroup\noexpand\hyperref[chapter-\zref@extract{#1}{chapter}]{%
    \zref@extract{#1}{chapter}}}\x%
}

\makeatother

\begin{document}

\chapter{something}
\blindtext[1]

\chapter{something else}
\section{a section}
This is the most important equation in this chapter
\begin{equation}
  1=1 \label{eq:important-equation}
\end{equation}

\chapter{chapter 3}
As we have seen in Equation~\ref{eq:important-equation} in Chapter~\chapref{eq:important-equation} on page~\pageref{eq:important-equation}, we have something important
\end{document}

一些相关参考资料:

相关内容