algorithm2e 包中的 \SetAlgorithmName 带有单独的计数器

algorithm2e 包中的 \SetAlgorithmName 带有单独的计数器

我想使用 algorithm2e 包来编写两者的列表算法启发法。我希望\SetAlgorithmName以某种方式使用,即对启发式方法和算法使用单独的计数器。

因此,例如我会这样做:

\begin{algorithm}
\end{algorithm}

\SetAlgorithmName{Heuristics}

\begin{algorithm}
\end{algorithm}

我得到:

算法 1

启发式 1

并不是: 算法 1

启发式 2

和现在一样。

答案1

这是一种在被使用时才有效的方法hyperref(在未被使用时也一样),并且能根据\algorithmcfname和链接的内容正确设置计数器名称。

只需定义一个计数器,例如和一个包含的heuristics宏。如果计数器名为 foo,则也必须定义。\heuristicsnameHeuristics\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}

相关内容