我正在使用该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
您所做的很好,因为它可以工作。我不喜欢代码重复,所以我会通过仅定义一个以类型A
或B
为参数的环境来实现这一点。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
了环境定义。