以下代码运行正常!
\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
适用于float
和hyperref
软件包。)因此,当加载顺序为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
由软件包完成),而有软件包时,我们会丢失一个补丁。这会导致不同的行为,两种情况下都会出错,但错误的方式不同。hyperref
caption
2013 年 1 月 9 日星期三
更新:
Heiko Oberdiek(该hyperref
软件包的维护者)和我决定在我们的软件包内为这个错误的加载顺序实施一个解决方法hyperref
,float
因为这是一个非常常见的错误。
因此,当使用该软件包的至少 6.82q 版本hyperref
和该caption
软件包的 3.3 版本时,错误的加载顺序不会再造成任何损害。
请注意,这不会纠正有关该hyperref
包的其他不正确的加载顺序(请参阅 提供的 README ),只会纠正唯一的“浮动之前的超引用”,并且只有在额外使用hyperref
该包时才会纠正它。caption
笔记这些只是摘录http://www.latex-community.org/forum/viewtopic.php?f=46&t=20075我只复制了自己的帖子,没有复制其他人的帖子。所以如果你对整个故事感兴趣(以及我的猫看起来怎么样),请点击链接。