使用 hyperref 和 (`ruled`) algorithm2e 时的 PDF 参考链接

使用 hyperref 和 (`ruled`) algorithm2e 时的 PDF 参考链接

我测试了我制作的 PDF 文件中的某些链接,发现指向某个算法的所有链接(来自包algorithm2e)都会跳转到该算法的开头,跳过算法标题的一半和算法的标题。我使用包ruled的选项algorithm2e,这样标题就会位于实际算法上方。

这是一个简单的例子:

\documentclass{scrbook}

\usepackage[colorlinks=true,linkcolor=blue]{hyperref}

\usepackage[ruled]{algorithm2e}

\begin{document}
   Der Algorithmus \ref{alg:roundoff} approximiert das ''Closest Vector Problem``. 
   \newpage
       \begin{algorithm}
        \caption{\label{alg:roundoff}Babais \textsf{ROUNDING OFF-PROCEDURE}}

        \emph{Berechne $r_1, r_2, \ldots, r_n \in R$, sodass $\vec{q} = r_1\vec{b}_1+r_2\vec{b}_2+\cdots+r_n\vec{b}_n$ gilt.}\\
        $\vec{v} := \vec{0}$\\
        \For{$i = 1,2,\ldots,n$}
        {
            $\vec{v} := \vec{v} + \lfloor r_i\rceil \cdot \vec{b}_i$
        }
     \end{algorithm}
\end{document}

此代码将在第一页生成一个(蓝色)链接,指向第二页上的算法。但是当缩放并单击链接后,它将跳转到算法的以下部分:

规则算法中的跳跃目标错误

问题:是否可以调整算法的跳转位置(从包开始),这样即使使用包的选项,algorithm2e单击也会跳转到算法标题/标题之前的位置?ruledalgorithm2e

答案1

由于您使用的是ruled样式,因此标题始终放在顶部。因此,我们可以修补algorithm环境的开始并插入由相当于hypcapfor [ruled]{algorithm2e}?

以下补丁由xpatch,因为的定义algorithm采用可选参数:

\documentclass{scrbook}% http://ctan.org/pkg/koma-script

\usepackage[ruled]{algorithm2e}% http://ctan.org/pkg/algorithm2e
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}% http://ctan.org/pkg/hyperref
\usepackage{hypcap,xpatch}% http://ctan.org/pkg/{hypcap,xpatch}
\makeatletter
% \xpatch{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
\xpatchcmd{\algorithm}{\ignorespaces}{\ignorespaces%
  \smash{\raisebox{1.5\baselineskip}{\capstart}}}{}{}
% Insert \capstart immediately after algorithm environment starts
\makeatother
\begin{document}
Der Algorithmus \ref{alg:roundoff} approximiert das ''Closest Vector Problem``. 
\newpage
\begin{algorithm}
  \caption{\label{alg:roundoff}Babais \textsf{ROUNDING OFF-PROCEDURE}}
  \emph{Berechne $r_1, r_2, \ldots, r_n \in R$, sodass $\vec{q} = r_1\vec{b}_1+r_2\vec{b}_2+\cdots+r_n\vec{b}_n$ gilt.}\\
  $\vec{v} := \vec{0}$\\
  \For{$i = 1,2,\ldots,n$}
  {
    $\vec{v} := \vec{v} + \lfloor r_i\rceil \cdot \vec{b}_i$
  }
\end{algorithm}
\end{document}

算法名称不跨多行的所有情况都应涵盖。一个缺点是放置双重超目标,导致“具有相同标识符的目标”hyperref/pdfTeX 警告。

相关内容