![algorithm2e 包中的 \SetAlgorithmName 带有单独的计数器](https://linux22.com/image/343215/algorithm2e%20%E5%8C%85%E4%B8%AD%E7%9A%84%20%5CSetAlgorithmName%20%E5%B8%A6%E6%9C%89%E5%8D%95%E7%8B%AC%E7%9A%84%E8%AE%A1%E6%95%B0%E5%99%A8.png)
我想使用 algorithm2e 包来编写两者的列表算法和启发法。我希望\SetAlgorithmName
以某种方式使用,即对启发式方法和算法使用单独的计数器。
因此,例如我会这样做:
\begin{algorithm}
\end{algorithm}
\SetAlgorithmName{Heuristics}
\begin{algorithm}
\end{algorithm}
我得到:
算法 1
启发式 1
并不是: 算法 1
启发式 2
和现在一样。
答案1
这是一种在被使用时才有效的方法hyperref
(在未被使用时也一样),并且能根据\algorithmcfname
和链接的内容正确设置计数器名称。
只需定义一个计数器,例如和一个包含的heuristics
宏。如果计数器名为 foo,则也必须定义。\heuristicsname
Heuristics
\fooname
\documentclass{article}
\usepackage{etoolbox}
\usepackage{algorithm2e}
\usepackage{hyperref}
\newcommand{\heuristicsname}{Heuristics}
\newcounter{heuristics}
\makeatletter
\AtBeginDocument{%
\@ifpackageloaded{hyperref}{%
\let\orighyper@refstepcounter\hyper@refstepcounter%
\newcommand{\specialhyper@refstepcounter}[1]{%
\orighyper@refstepcounter{\@specialcountername}%
\renewcommand{\@currentHref}{\@specialcountername.\csname the\@specialcountername\endcsname}%
}
}{%
\providecommand{\autoref}[1]{\ref{#1}}
\newcommand{\specialhyper@refstepcounter}[1]{%
}
}
\newcommand{\specialcountername}[1]{%
\def\@specialcountername{#1}
}
\AtBeginEnvironment{algorithm}{%
\specialcountername{heuristics}%
\edef\temp@@a{\csname\@specialcountername name\endcsname}
\edef\temp@@b{\algorithmcfname}
\ifx\temp@@a\temp@@b
\csletcs{c@algocf}{c@\@specialcountername}
\csletcs{thealgocf}{the\@specialcountername}
\let\hyper@refstepcounter\specialhyper@refstepcounter
\fi
}
}
\makeatother
\begin{document}
\listofalgorithms
See \ref{algo} and \ref{heu} or \autoref{heu}
\begin{algorithm}
\KwData{foo}
\caption{Foo Algorithm} \label{algo}
\end{algorithm}
\SetAlgorithmName{\heuristicsname}{}{}
\clearpage
\begin{algorithm}
\KwData{foo}
\caption{Foo Heuristics} \label{heu}
\end{algorithm}
\end{document}
使用改进的设置进行更新
用于\SetupForOtherCounter{foo}{Foo}
定义新的计数器名称和环境标题的新名称。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{algorithm2e}
\usepackage{hyperref}
\makeatletter
\newcommand{\SetupForOtherCounter}[2]{%
\@ifundefined{c@#1}{%
\newcounter{#1}%
}{}%
\@ifundefined{#1name}{%
\expandafter\newcommand\csname #1name\endcsname{#2}
}{%
\expandafter\renewcommand\csname #1name\endcsname{#2}
}%
}
\makeatother
\SetupForOtherCounter{heuristics}{Heuristics}
\makeatletter
\AtBeginDocument{%
\@ifpackageloaded{hyperref}{%
\let\orighyper@refstepcounter\hyper@refstepcounter%
\newcommand{\specialhyper@refstepcounter}[1]{%
\orighyper@refstepcounter{\@specialcountername}%
\renewcommand{\@currentHref}{\@specialcountername.\csname the\@specialcountername\endcsname}%
}
}{%
\providecommand{\autoref}[1]{\ref{#1}}
\newcommand{\specialhyper@refstepcounter}[1]{%
}
}
\newcommand{\specialcountername}[1]{%
\def\@specialcountername{#1}
}
\AtBeginEnvironment{algorithm}{%
\specialcountername{heuristics}%
\edef\temp@@a{\csname\@specialcountername name\endcsname}
\edef\temp@@b{\algorithmcfname}
\ifx\temp@@a\temp@@b
\csletcs{c@algocf}{c@\@specialcountername}
\csletcs{thealgocf}{the\@specialcountername}
\let\hyper@refstepcounter\specialhyper@refstepcounter
\fi
}
}
\makeatother
\begin{document}
\listofalgorithms
See \ref{algo} and \ref{heu} or \autoref{heu}
\begin{algorithm}
\KwData{foo}
\caption{Foo Algorithm} \label{algo}
\end{algorithm}
\SetAlgorithmName{\heuristicsname}{}{}
\clearpage
\begin{algorithm}
\KwData{foo}
\caption{Foo Heuristics} \label{heu}
\end{algorithm}
\end{document}