将 `\pageref` 从 `hyperref` 中取出

将 `\pageref` 从 `hyperref` 中取出

当我修改\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

我使用了它\getpagerefnumberrefcount提供一个可以用于计算的数字。

此外,我将分配移到了\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 页。如果要添加页码,则应考虑向前也可以添加参考。

相关内容