算法上的多个计数器

算法上的多个计数器

我正在使用该algorithm包,并想用单独的计数器对两种类型的算法进行编号。

我想知道你对我下面的代码有什么看法

有什么错误吗?可以做得更好吗?

\documentclass[a4paper, 12pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{algorithmic}
\usepackage{algorithm}
\usepackage{caption}

\newcounter{typeACounter}
\newcounter{typeBCounter}

\newenvironment{typeA}[1]
{
\renewcommand\labelenumi{\bfseries\theenumi.}
\setcounter{algorithm}{\value{typeACounter}}
\floatname{algorithm}{TypeA}
\begin{algorithm}[H]
\caption{#1}
\begin{algorithmic}
\STATE
\begin{enumerate}
}
{
\end{enumerate}
\end{algorithmic}
\end{algorithm}
\addtocounter{typeACounter}{1}
}

\newenvironment{typeB}[1]
{
\setcounter{algorithm}{\value{typeBCounter}}
\floatname{algorithm}{TypeB}
\begin{algorithm}[H]
\caption{#1}
\begin{algorithmic}
}
{
\end{algorithmic}
\end{algorithm}
\addtocounter{typeBCounter}{1}
}

\begin{document}

\begin{typeB}{test}
\IF{a}
\STATE b
\ENDIF
\end{typeB}

\begin{typeB}{test}
\IF{a}
\STATE b
\ENDIF
\end{typeB}

\begin{typeA}{test}
\item t
\item tt
\end{typeA}

\begin{typeB}{test}
\IF{a}
\STATE b
\ENDIF
\end{typeB}

\begin{typeA}{test}
\item t
\item tt
\end{typeA}

\begin{typeA}{test}
\item t
\item tt
\end{typeA}

\begin{typeB}{test}
\IF{a}
\STATE b
\ENDIF
\end{typeB}

\end{document}

其结果为: 在此处输入图片描述

答案1

您所做的很好,因为它可以工作。我不喜欢代码重复,所以我会通过仅定义一个以类型AB为参数的环境来实现这一点。Latex 计数器非常灵活,因此类似的东西\value{type#1Counter}可以工作。

其次,\begin{algorithm}...\end{algorithm}我不会在你的环境中编写,而是直接使用\algorithm...\endalgorithm。这两个版本几乎相同,只是第一个版本将所有内容都放在它自己的组中,但这在这里并不是必需的,因为你的环境启动了它自己的组。

最后,我会%在行尾添加一些 ',以避免环境意外添加额外的空格。它们可能不是必需的,但我很懒,不想跟踪空格何时重要,何时不重要。

这是包含这些更改的代码的更新版本。输出相同。

\documentclass[a4paper, 12pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{algorithmic}
\usepackage{algorithm}
\usepackage{caption}

\newcounter{typeACounter}
\newcounter{typeBCounter}

\renewcommand\labelenumi{\bfseries\theenumi.}
\newenvironment{Algorithm}[2]%
{ \setcounter{algorithm}{\value{type#1Counter}}%
  \stepcounter{type#1Counter}%
  \floatname{algorithm}{Type #1}%
  \algorithm[H]%
  \caption{#2}%
  \algorithmic%
  \ifx#1A\relax% add \STATE and start enumerate if A
    \STATE\enumerate\let\myending\endenumerate% 
  \else\let\myending\relax%
  \fi%%
}{\myending\endalgorithmic\endalgorithm}

\begin{document}

  \begin{Algorithm}{B}{test}
    \IF{a}
    \STATE b
    \ENDIF
  \end{Algorithm}

  \begin{Algorithm}{B}{test}
    \IF{a}
    \STATE b
    \ENDIF
  \end{Algorithm}

  \begin{Algorithm}{A}{test}
    \item t
    \item tt
  \end{Algorithm}

  \begin{Algorithm}{B}{test}
    \IF{a}
    \STATE b
    \ENDIF
  \end{Algorithm}

  \begin{Algorithm}{A}{test}
  \item t
  \item tt
  \end{Algorithm}

  \begin{Algorithm}{A}{test}
    \item t
    \item tt
  \end{Algorithm}

  \begin{Algorithm}{B}{test}
    \IF{a}
    \STATE b
    \ENDIF
  \end{Algorithm}

\end{document}

如果我们处于类型 A,则测试会插入 and 环境。在这种情况下,它还会设置为\ifxA#1\relax\STATE否则,这是 TeX 不执行任何操作的方式。\enumerate\myending\endenumerate\relax

哦,我将其移出\renewcommand\labelenumi了环境定义。

相关内容