我在用超链接排版一本包含许多不同研究文章的书。每篇文章都有自己的一套定理、定义等,每篇文章都有自己的一套定理、定义等。\maketitle正如预期的那样,相应的计数器被重置。因此,有多个“定理 1”等。这对于 hyperref 来说似乎没有问题,因为它们都有不同的锚点;一切都是理所当然的。
现在有些文章包含使用算法2e并且这些计数器默认不会重置,这就是为什么我放了一个
\setcounter{algocf}{0}
在每篇文章前面。这会更改标签,但我得到了
destination with the same identifier (name {algocf.1})
has been already used, duplicate ignored
并且超链接始终指向“第一个”算法 1 等等。
恐怕这个解决方案(考虑了数字和表格)对于我的问题不起作用:
我试过
\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
重新定义。\theHalgocf
caption
我已将其更改为\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}}}
但现在无法测试,因为之前的修复对我有用