使用 algorithm2e 和 subfig 在 hyperref 中锚定

使用 algorithm2e 和 subfig 在 hyperref 中锚定

我在用超链接排版一本包含许多不同研究文章的书。每篇文章都有自己的一套定理、定义等,每篇文章都有自己的一套定理、定义等。\maketitle正如预期的那样,相应的计数器被重置。因此,有多个“定理 1”等。这对于 hyperref 来说似乎没有问题,因为它们都有不同的锚点;一切都是理所当然的。

现在有些文章包含使用算法2e并且这些计数器默认不会重置,这就是为什么我放了一个

\setcounter{algocf}{0}

在每篇文章前面。这会更改标签,但我得到了

destination with the same identifier (name {algocf.1})
has been already used, duplicate ignored

并且超链接始终指向“第一个”算法 1 等等。

恐怕这个解决方案(考虑了数字和表格)对于我的问题不起作用:

hyperref 指向错误的图形/表格并重置计数器

我试过

\renewcommand{\theHalgocf}{new.\thealgocf}

但无济于事。

同样的问题也出现在子浮点型命令来自子图包(这里,计数器被重置,但锚点仍然不明确):

destination with the same identifier (name{subfigure.4.2})
has been already used, duplicate ignored

平均能量损失

\documentclass{article}

\usepackage{algorithm2e}
\usepackage{hyperref}
\usepackage{cleveref}

\crefname{algorithm}{Algorithm}{Algorithms}

\begin{document}

\begin{algorithm}
  \caption{Algo 1}\label{1}
  Test\;
\end{algorithm}

\setcounter{algocf}{0}

\begin{algorithm}
  \caption{Algo 2}\label{2}
  Test\;
\end{algorithm}

\Cref{1} and \cref{2}.

\end{document}

答案1

造成该问题的原因是在其包装器中再次algorithm2e重新定义。\theHalgocfcaption

我已将其更改为\thealgocf\theHalgocf每次\Maketitle调用时添加一个前缀,这将启动一个titlectr计数器,并重置计数器algocf

\Maketitle是 的包装器\maketitle,后者若不改变则不能多次使用——OP 并未展示如何进行这些改变以允许 多次使用\maketitle

但是,除此以外,常规\maketitle不会重置计数器footnote

\documentclass{article}

\usepackage{algorithm2e}
\usepackage{chngcntr}
\usepackage{hyperref}
\usepackage{cleveref}


\newcounter{titlectr}

\counterwithin*{algocf}{titlectr}

%\counterwithin*{subfig}{titlectr}% for subfigures



\makeatletter
\AtBeginDocument{%
\long\def\algocf@caption@algo#1[#2]#3{%
  \ifthenelse{\equal{\algocf@algocfref}{\relax}}{}{\algocf@captionref}%
  \@ifundefined{hyper@refstepcounter}{\relax}{% if hyper@refstepcounter undefind, no hyperref, else...
    \ifthenelse{\equal{\algocf@algocfref}{\relax}}{\renewcommand{\theHalgocf}{\thetitlectr.\thealgocf}}{% take algocf as Href
      \renewcommand{\theHalgocf}{\thetitlectr.\algocf@algocfref}}%else if SetAlgoRefName done, take this name as ref.
    \hyper@refstepcounter{algocf}%set algocf as category of ref
  }%
   \algocf@latexcaption{#1}[{#2}]{{#3}}% call original caption
}%
}
\makeatother




\newcommand{\Maketitle}{%
  \stepcounter{titlectr}%
}


\title{foo}

\author{A. U. Thor}

\crefname{algorithm}{Algorithm}{Algorithms}

\begin{document}
\Maketitle

\begin{algorithm}
  \caption{Algo 1}\label{1}
  Test\;
\end{algorithm}


\Maketitle

\begin{algorithm}
  \caption{Algo 2}\label{2}
  Test\;
\end{algorithm}

\Cref{1} and \cref{2}.

\end{document}

摘录如下\jobname.aux

\@writefile{loa}{\contentsline {algocf}{\numberline {1}{\ignorespaces Algo 1}}{1}{algocf.1.1}}
\newlabel{1}{{1}{1}{}{algocf.1.1}{}}
\newlabel{1@cref}{{[algorithm][1][]1}{[1][1][]1}}
\@writefile{loa}{\contentsline {algocf}{\numberline {1}{\ignorespaces Algo 2}}{1}{algocf.2.1}}
\newlabel{2}{{1}{1}{}{algocf.2.1}{}}
\newlabel{2@cref}{{[algorithm][1][]1}{[1][1][]1}}

答案2

过去也遇到过类似的问题:

梅威瑟:

\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}

\crefname{figure}{Fig}{Figs}

\begin{document}

\begin{figure}
  \caption{Test1}\label{1}
\end{figure}

\begin{figure}
\caption{Test2}\label{2}
\end{figure}

\setcounter{figure}{0}

\pagebreak
\begin{figure}
\caption{Test3}\label{3}
\end{figure}

\Cref{1} and \cref{2}.

\Cref{3}.

\end{document}

这会出现错误,并且图 1 中的第二个链接不起作用(忽略)

pdfTeX 警告(ext4):具有相同标识符(name{figure.1})的目标已被使用,重复项被忽略

通过添加和使用 caption 或 subcaption 包问题解决:

\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{caption}
%\usepackage{subcaption}

\crefname{figure}{Fig}{Figs}


\begin{document}

\begin{figure}
  \captionof{figure}{Test1}\label{1}
\end{figure}

\begin{figure}
\captionof{figure}{Test2}\label{2}
\end{figure}

\setcounter{figure}{0}

\pagebreak
\begin{figure}
\captionof{figure}{Test3}\label{3}
\end{figure}

\Cref{1} and \cref{2}.

\Cref{3}.

\end{document}

现在一切都按预期进行。

PS:抱歉,更改了示例,但没有安装算法,无法测试。

caption另一种选择(以防使用或 也不起作用subcaption)是我创建的命令,例如

\AtBeginDocument{\let\oldcaptionof\captionof
\renewcommand{\captionof}[2]{\ifx#1{figure}\captionsetup{type=figure}\else\ifx#1{table}\captionsetup{type=table}\else\ifx#1{algorithm}\captionsetup{type=algorithm}\else\ifx#1{subfigure}\captionsetup{type=subfigure}\else\ifx#1{subtable}\captionsetup{type=subtable}\else\ifx#1{subalgorithm}\captionsetup{type=subalgorithm}\fi\fi\fi\fi\fi\fi\oldcaptionof{#1}{#2}}}

但现在无法测试,因为之前的修复对我有用

相关内容