当我修改\ref
到还当引用的浮动内容位于前面几页以上时,打印页码。但我真的希望它hyperref
也能使用该包成为一个不错的链接!
我如何修改我的命令以便使页码也成为链接?
\documentclass{report}
\usepackage{mwe}
% \usepackage[% Un-commenting this causes the page number not to appear
% pagebackref=true,
% ]{hyperref}
\usepackage{ifthen}
\usepackage{calc}
\usepackage{xspace}
\let\oldref\ref
\renewcommand\ref[1]{%
\newcount\cnt
\cnt=\thepage
\advance\cnt by -2
\ifthenelse{%
\pageref{#1} < \cnt%
}{%
\oldref{#1}~p.\,\pageref{#1}\xspace%
}{%
\oldref{#1}%
}%
}
\begin{document}
\blindtext[1]
Figure~\ref{fig:example_image_a}
%
\begin{figure}
\centering
\includegraphics[width=0.6\textwidth]{example-image-a}%
\caption{
example-image-a
\label{fig:example_image_a}
}
\end{figure}
\Blindtext[10][10]
Figure~\ref{fig:example_image_a}
\end{document}
答案1
hyperref
推翻\ref
,除非新的定义\AtBeginDocument
egreg 会因为我保留而打倒我xspace
;-)
此外:\pageref{#1}
如果它在表达式内,我怀疑它是否会给出一个数字\ifthenelse
。
我使用了它\getpagerefnumber
来refcount
提供一个可以用于计算的数字。
此外,我将分配移到了\cnt
外面——否则每次调用\ref
时都会分配一个计数寄存器!。\ref
\documentclass{report}
\usepackage{mwe}
\usepackage[% Un-commenting this causes the page number not to appear
% pagebackref=true,
]{hyperref}
\usepackage{refcount}
\usepackage{calc}
\usepackage{xspace}
\let\oldref\ref
\newcount\cnt
\AtBeginDocument{%
\renewcommand\ref[1]{%
\cnt=\value{page}%
\advance\cnt by -2
\ifnum\cnt > \getpagerefnumber{#1}
\oldref{#1}~p.\,\pageref{#1}\xspace%
\else
\oldref{#1}%
\fi
}
}
\begin{document}
\blindtext[1]
Figure~\ref{fig:example_image_a}
%
\begin{figure}
\centering
\includegraphics[width=0.6\textwidth]{example-image-a}%
\caption{
example-image-a
\label{fig:example_image_a}
}
\end{figure}
\Blindtext[10][10]
Figure~\ref{fig:example_image_a}
\end{document}
答案2
您可能不想重新定义,而是\ref
想研究加载瓦里雷夫包并使用该包\vref
和\fullref
宏。它们基本上执行您修改后的\ref
宏所执行的操作。
如果hyperref
包也加载了,则用\fullref
图号(例如“n”)和页码(例如“m”)是单独的超目标。使用\vref
,整个字符串 [Figure] “n on page m” 是单个超目标。
\documentclass{report}
\usepackage{mwe}
\usepackage{varioref}
\usepackage[colorlinks]{hyperref}
\begin{document}
Figure \vref{fig:example_image_a}
\blindtext[1]
\begin{figure}[h!]
\centering
\includegraphics[width=0.6\textwidth]{example-image-a}%
\caption{example-image-a}\label{fig:example_image_a}
\end{figure}
\Blindtext[10]
Figure \fullref{fig:example_image_a}
Figure \vref{fig:example_image_a}
\end{document}
答案3
以下是略有不同的方法基督教的。它为每个创建一个自动化\label
的\ref
确保确保页码准确。
\documentclass{article}
\usepackage{lipsum}% Just for this example
\usepackage{refcount,hyperref,graphicx}
\newcounter{refcnt}
\AtBeginDocument{%
\let\oldref\ref
\renewcommand\ref[1]{%
\oldref{#1}% Place reference...
\stepcounter{refcnt}\label{mark-\therefcnt}% Mark current \ref
\ifnum\getpagerefnumber{mark-\therefcnt} > \numexpr\getpagerefnumber{#1}+2\relax
\nobreakspace p.\,\pageref{#1}% ...conditionally place page ref
\fi
}%
}
\begin{document}
\sloppy% Just for this example
\lipsum[1]
Figure~\ref{fig:example_image}.
\begin{figure}[ht]
\centering
\includegraphics[width=0.6\textwidth]{example-image}%
\caption{example-image}\label{fig:example_image}
\end{figure}
\lipsum[2-15]
Figure~\ref{fig:example_image}.
\end{document}
上述方法仅考虑参考落后超过 2 页。如果要添加页码,则应考虑向前也可以添加参考。