我想建立一个宏\myautoref{eq:a}
,
- 如果链接和链接对象位于同一页面上,则产生
\autoref{eq:a}
- 如果链接和链接对象处于不同的页面产生
\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
通过按此顺序加载、和包,varioref
您hyperref
可以直接获得您正在寻找的功能。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}