algorithm(ic) 和 hyperref 的问题

algorithm(ic) 和 hyperref 的问题

以下代码运行正常!

\documentclass{book}

% \usepackage{subfig}
% \usepackage{subcaption}

\usepackage[colorlinks]{hyperref}

\usepackage{algorithm}
\usepackage[noend]{algorithmic}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
We outline this in Algorithm~\ref{alg1}.
%%
\begin{algorithm}
\caption{Algo}
\label{alg1}
\begin{algorithmic}
  \STATE A
\end{algorithmic}
\end{algorithm}

\end{document}

但是,一旦我按照提示添加subfig或,我就会收到警告subcaption

name{algorithm.1} has been referenced but does not exist, replaced by a fixed one

并且算法的链接不起作用。请注意,代码没有使用subfig、 或的任何功能subcaption。它一定来自这些包中的一些宏重新定义。经过一番搜索,我发现算法修复subfig来自我们的@AxelSommerfeldt,但这并不能解决警告问题。(奇怪的是,当和subcaption不在时也不需要它。)

我忽略了什么?

答案1

这是一个复制粘贴的答案,源自http://www.latex-community.org/forum/viewtopic.php?f=46&t=20075

2012 年 4 月 20 日星期五

algorithm和的正确加载顺序hyperref是:

\usepackage{float}  % load float package first!
...
\usepackage{hyperref} % let hyperref patch the float package stuff
...
\usepackage{algorithm} % let algorithm use the patched version of the float package

hyperref有关详细信息,请参阅自述文件。

2012 年 4 月 26 日星期四

我对这个案例做了进一步的研究。为什么使用caption包的(错误)行为与不使用包的(同样错误的)行为不同caption

答案:

如果在软件包hyperref之后加载float,它会修补 float 软件包提供(或修补)的两个宏:\@caption\float@makebox。如果在软件包hyperref之前加载float,则会缺少这两个补丁。

如果caption另外加载了 软件包,则caption软件包也会对 进行修补\@caption。 (并且 软件包提供的代码caption适用于floathyperref软件包。)因此,当加载顺序为caption- hyperref-时float,在这种情况下只缺少一个补丁,即hyperref对 进行的修补\float@makebox

\documentclass[a4paper]{book} 

\usepackage[centerlast,small,sc]{caption} % Loaded by Thesis.cls
\usepackage{hyperref}                     % Loaded by Thesis.cls

\usepackage{algpseudocode}
\usepackage{algorithm}

\makeatletter
% Patch of \float@makebox, taken from hyperref.sty [2012/02/28 v6.82p]
%% DO NOT TRY THIS AT HOME, USE CORRECT LOAD ORDER OF PACKAGES INSTEAD!
  \let\HyOrg@float@makebox\float@makebox
  \renewcommand{\float@makebox}[1]{%
    ... (Code removed)
  }%
\makeatother

\begin{document}

\tableofcontents

\chapter{One}

\begin{algorithm}
\caption{Iris Detection Algorithm}\label{alg:myaaa}
...
\end{algorithm}

\chapter{Two}

See Algorithm~\ref{alg:myaaa}.

\end{document}

因此,没有软件包时,我们会丢失两个补丁(如果软件包加载顺序正确,通常会caption由软件包完成),而有软件包时,我们会丢失一个补丁。这会导致不同的行为,两种情况下都会出错,但错误的方式不同。hyperrefcaption

2013 年 1 月 9 日星期三

更新:

Heiko Oberdiek(该hyperref软件包的维护者)和我决定在我们的软件包内为这个错误的加载顺序实施一个解决方法hyperreffloat因为这是一个非常常见的错误。

因此,当使用该软件包的至少 6.82q 版本hyperref和该caption软件包的 3.3 版本时,错误的加载顺序不会再造成任何损害。

请注意,这不会纠正有关该hyperref包的其他不正确的加载顺序(请参阅 提供的 README ),只会纠正唯一的“浮动之前的超引用”,并且只有在额外使用hyperref该包时才会纠正它。caption

笔记这些只是摘录http://www.latex-community.org/forum/viewtopic.php?f=46&t=20075我只复制了自己的帖子,没有复制其他人的帖子。所以如果你对整个故事感兴趣(以及我的猫看起来怎么样),请点击链接。

相关内容