使用 \captionlistentry 时 Hyperref 链接到第一页

使用 \captionlistentry 时 Hyperref 链接到第一页

在我的文档中,我定义了一个新的trivfloat环境,以便方程式列表。为了将元素添加到此列表中,我使用\captionlistentry(以避免标题出现在等式下方)。但是,我意识到当使用hyperref,所有出现在方程式列表链接到第一页。我查看了hyperref的文档和互联网,但找不到任何可以帮助我解决这个问题的东西。

这是我所做工作的一个简单的例子:

\documentclass{report}

\usepackage{trivfloat}
\usepackage{hyperref}
\usepackage{subcaption}

\trivfloat{Equation}

\begin{document}

\listof{Equation}{List of Equations}

\chapter*{}
\begin{Equation}[!htb]
\begin{equation}
6 \times 9 = 42
\end{equation}
\captionlistentry{Life, the universe and everything}
\end{Equation}

\end{document}

编辑:

感谢 John Kormylo 的回答,我成功地找到了最小示例的解决方案:

\documentclass{report}

\usepackage{trivfloat}
\usepackage{hyperref}
\usepackage{caption}
\usepackage{environ}

\trivfloat{Equation}

\newsavebox{\tempbox}

\begin{document}

\let\oldEquation=\Equation
\let\oldendEquation=\endEquation
\let\Equation\relax
\let\endEquation\relax
\NewEnviron{Equation}[1][hbtp]%
{\oldEquation[#1]%
 \savebox{\tempbox}{\begin{minipage}{\textwidth}%
   \BODY
   \end{minipage}}%
 \hypertarget{Equation.\thechapter.\theequation}{\usebox{\tempbox}}%
 \oldendEquation}

\listof{Equation}{List of Equations}

\chapter*{}
\begin{Equation}[!htb]
\begin{equation}
6 \times 9 = 42
\end{equation}
\captionlistentry{Life, the universe and everything}
\end{Equation}

\end{document}

\chapter但是,如果方程式位于 a 内(而不是 内) ,则此解决方案无效\chapter*。知道我做错了什么吗?

答案1

Hyperref 修改\caption以添加\hypertarget,但它不修改\captionlistentry。要链接到方程(而不是在方程下方),需要将整个方程环境放在 内\hypertarget,这是在方程计数器递增之前。

有趣的是,直到 才定义 Equation 环境\begin{document}

\documentclass{report}

\usepackage{trivfloat}
\usepackage{hyperref}
\usepackage{caption}
\usepackage{environ}

\trivfloat{Equation}

\newsavebox{\tempbox}

\begin{document}

\let\oldEquation=\Equation
\let\oldendEquation=\endEquation

\makeatletter
\RenewEnviron{Equation}[1][hbtp]%
{\oldEquation[#1]%
 \savebox{\tempbox}{\begin{minipage}{\textwidth}%
   \BODY
   \end{minipage}}%
 \hypertarget{\@currentHref}{\usebox{\tempbox}}%
 \oldendEquation}
\makeatother

\listof{Equation}{List of Equations}

\chapter*{}
\begin{Equation}[!htb]
\begin{equation}
6 \times 9 = 42
\end{equation}
\captionlistentry{Life, the universe and everything}
\end{Equation}

\end{document}

答案2

John Kormylo 解决方案的一个更简单的替代方案:

\usepackage{hyperref}
\usepackage{hypcap}

\begin{document}

\begin{<float env>}
  \capstart
  \captionlistentry{<list entry>}
  ...
\end{<float env>}

为了保持 DRY,我们可以定义一个新的环境:

\newenvironment{listfloat}[1]
{
  \begin{<float env>}
    \capstart
    \captionlistentry{#1}
}{
  \end{<float env>}
}

在我的例子中,我使用它来链接到遵循以下语法的伪代码过程算法导论。这是我使用的代码:

\usepackage[hidelinks]{hyperref}
\usepackage{hypcap}
\usepackage[plain]{algorithm}
\usepackage[noend]{algpseudocode}

\newcommand{\Title}[2]{\item[$\Call{#1}{#2}$]}

\renewcommand{\listalgorithmname}{List of Procedures}

% Usage:
%   \begin{procedure}{position}{title}{args}
%   ...
%   \end{procedure}
\newenvironment{procedure}[3]
{
  \begin{algorithm}[#1]
  \capstart
  \captionlistentry{\Call{#2}{}}
  \begin{algorithmic}[1]
  \Title{#2}{#3}
}{
  \end{algorithmic}
  \end{algorithm}
}

\begin{document}

使用示例:

% Same preamble as above

\newcommand{\floor}[1]{\left\lfloor #1 \right\rfloor}

\begin{document}
\begin{procedure}{!ht}{Merge-Sort}{A, p, r}
\If{$p \geq r$}
    \State \Return
\EndIf
\State $q = \floor{(p + r) / 2}$
\State $\Call{Merge-Sort}{A, p, q}$
\State $\Call{Merge-Sort}{A, q + 1, r}$
\State $\Call{Merge}{A, p, q, r}$
\end{procedure}
\end{document}

输出结果如下: 在此处输入图片描述 在此处输入图片描述

相关内容