\autoref,仅在需要时引用页面(以防页码不同)

\autoref,仅在需要时引用页面(以防页码不同)

我想建立一个宏\myautoref{eq:a}

  1. 如果链接和链接对象位于同一页面上,则产生\autoref{eq:a}
  2. 如果链接和链接对象处于不同的页面产生\autoref{eq:a} on \autopageref{eq:a}

在下面的例子中,这意味着页面引用仅出现在第 1 页的引用之后。

\documentclass{book}
\usepackage{amsmath}
\usepackage{nameref}
\usepackage[unicode,pdfpagelabels]{hyperref}
\begin{document}
\autoref{eq:a} on \autopageref{eq:a}

\pagebreak

\autoref{eq:a} on \autopageref{eq:a}

\begin{gather}\label{eq:a}
a
\end{gather}
\end{document}

答案1

回答基于测试当前页码与所指参考页码之间的相等性

\documentclass{book}
\usepackage{amsmath}
\usepackage{nameref}
\usepackage[unicode,pdfpagelabels]{hyperref}

\usepackage{ifthen}
\usepackage{refcount}

\newcounter{sp}
\newcommand{\myautoref}[1]{%
    \stepcounter{sp}\label{sp-\thesp}%
    \autoref{#1}%
    \ifthenelse{\equal{\getpagerefnumber{#1}}{\getpagerefnumber{sp-\thesp}}}{}{%
        on \autopageref{#1}%
    }%
}

\begin{document}

\myautoref{eq:a}

\pagebreak

\myautoref{eq:a}

\begin{gather}\label{eq:a}
  a
\end{gather}
\end{document}

答案2

通过按此顺序加载、和包,variorefhyperref可以直接获得您正在寻找的功能。cleveref

然后,\vref{eq:1}产生

  • equation (1)如果交叉引用调用(由 产生\vref)和被交叉引用的对象(此处为编号为(1))都在同一页面

  • equation (1) on the facing page如果文件采用双面布局——就像book文档类的情况),并且标注和公式位于在对页上

  • 两者equation (1) on the following page任一equation (1) on the preceding page页码相差 1不放在对开页上;

  • equation (1) on page [x]如果交叉引用和公式的页码相差 2 或更多

此设置可轻松适应非英语语言。例如,如果ngerman指定为文档类选项,并且还babel加载了包,\vref{eq:1}则会自动生成“Gleichung (1) auf der vorherigen Seite”而不是“上一页的方程式 (1)”。

MWE:

\documentclass{book}

\usepackage{varioref}
\usepackage[colorlinks,allcolors=blue]{hyperref}
\usepackage[noabbrev,nameinlink]{cleveref}

\begin{document}
\vref{eq:a}

\clearpage
\vref{eq:a}

\clearpage
\vref{eq:a}
\begin{equation}\label{eq:a} a \end{equation}

\clearpage
\vref{eq:a}

\clearpage
\vref{eq:a}

\end{document} 

相关内容