在我的文档中,我定义了一个新的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}