最近在使用 LaTeX \LaTeX LATEX完成算法设计大作业(写一篇论文综述)时,遇到了算法编号去除的问题,现总结如下
PS. 算法内容是随便打的,错了不要在意
首先给出一个有编号的算法例子:
源码:
\documentclass{article}
\usepackage{algorithm,algpseudocode,amsmath}
\begin{document}
\begin{algorithm}
\caption{My algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{MyProcedure}{}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}.
\State \textbf{close};
\EndIf
\State $i \gets i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}.
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
最简单的方法是将计数器归零。
即添加代码
\renewcommand{\thealgorithm}{}
完整代码为:
\documentclass{article}
\usepackage{algorithm,algpseudocode,amsmath}
\begin{document}
\begin{algorithm}
\renewcommand{\thealgorithm}{}
\caption{My algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{MyProcedure}{}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}.
\State \textbf{close};
\EndIf
\State $i \gets i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}.
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
当这串代码放在导言区会使得整篇文章的编号都没有;放在某个算法之前会使得之后的算法没有编号(如一共有5个算法,在第二个和第三个之间添加这串代码,会变成算法1,算法2,之后的算法均没有编号);如果放在算法代码的中间也会出现问题(比如在第一个算法中添加这串代码,第一个算法没有编号,而第二个算法依旧是二)。
不过这些情况也用解决方法
那就是手动编号,比如第三种情况,第一个算法没有编号,但是第二个算法依旧是算法二,我们想要变成算法一,那就手动在算法代码中间添加如下代码:
\renewcommand{\thealgorithm}{1}
依次类推。
我们观察algorithm宏包文件可以看到\fnum@algorithm的定义:
> \fnum@algorithm=macro:
->\fname@algorithm {} \thealgorithm .
因此我们可以将\fnum@algorithm重定义:
\renewcommand{\fnum@algorithm}{\fname@algorithm}
完整代码如下:
\documentclass{article}
\usepackage{algorithm,algpseudocode,amsmath}
\makeatletter
\renewcommand{\fnum@algorithm}{\fname@algorithm}
\makeatother
\begin{document}
\begin{algorithm}
\caption{My algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{MyProcedure}{}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}.
\State \textbf{close};
\EndIf
\State $i \gets i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}.
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
和方法二类似,caption宏包也提供了方法:
\usepackage{caption}
\DeclareCaptionLabelFormat{algnonumber}{Algorithm}
\captionsetup[algorithm]{labelformat=algnonumber}
完整代码为:
\documentclass{article}
\usepackage{algorithm,algpseudocode,amsmath}
\usepackage{caption}
\DeclareCaptionLabelFormat{algnonumber}{Algorithm}
\captionsetup[algorithm]{labelformat=algnonumber}
\begin{document}
\begin{algorithm}
\caption{My algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{MyProcedure}{}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}.
\State \textbf{close};
\EndIf
\State $i \gets i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}.
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
首先,页给出一个有编号的算法例子:
源码:
\documentclass{article}
\usepackage[ruled]{algorithm2e}
\begin{document}
\begin{algorithm}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\end{document}
algorithm2e宏包说明文档在21页提供了一个方法
即\TitleOfAlgo{title}。
完整代码为:
\documentclass{article}
\usepackage{algorithm2e}
\begin{document}
\begin{algorithm}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\TitleOfAlgo{SA}
\end{algorithm}
\end{document}
截图如下:
然而这种方法对于三线表格式的算法不管用,如果强行使用,效果就会如下:
这显然不是我们想要的结果。
我们可以定义两个宏:
\newcommand{\RemoveAlgoNumber}{\renewcommand{\fnum@algocf}{\AlCapSty{\AlCapFnt\algorithmcfname}}}
\newcommand{\RevertAlgoNumber}{\algocf@resetfnum}
第一个宏命令是删除编号,第二个是还原编号。
完整代码为:
\documentclass{article}
\usepackage[ruled]{algorithm2e}
\usepackage{caption}
\makeatletter
\newcommand{\RemoveAlgoNumber}{\renewcommand{\fnum@algocf}{\AlCapSty{\AlCapFnt\algorithmcfname}}}
\newcommand{\RevertAlgoNumber}{\algocf@resetfnum}
\makeatother
\begin{document}
\RemoveAlgoNumber
\begin{algorithm}
\caption*{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\end{document}
截图如下:
如果想要回复编号可以使用\RevertAlgoNumber
命令。
完整代码如下:
\documentclass{article}
\usepackage[ruled]{algorithm2e}
\usepackage{caption}
\makeatletter
\newcommand{\RemoveAlgoNumber}{\renewcommand{\fnum@algocf}{\AlCapSty{\AlCapFnt\algorithmcfname}}}
\newcommand{\RevertAlgoNumber}{\algocf@resetfnum}
\makeatother
\begin{document}
\begin{algorithm}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\RemoveAlgoNumber
\begin{algorithm}
\caption*{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\RevertAlgoNumber
\begin{algorithm}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\end{document}
查看algorithm2e
关于\thealgocf
,我们重定义\thealgocf
即可,重定义如下:
\renewcommand{\thealgocf}{}
完整代码为:
\documentclass{article}
\usepackage[ruled]{algorithm2e}
\renewcommand{\thealgocf}{}
\begin{document}
\begin{algorithm}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
\textbf{call Function 2: St}\;
\textbf{call Function 3: Su}\;
\textbf{call Function 4: Un}\;
}
\end{algorithm}
\end{document}
截图如下:
同样,该方法也存在于对algorithm
的解决方法一同样的问题。
当然,对于这一小bug的解决方法也一样——手动编号。
我们给出一个例子,该例子中有无个算法,其中第三个算法不希望编号,其他算法希望依次编号,即算法一、算法二、算法三、算法四。
完整代码为:
\documentclass{article}
\usepackage[ruled]{algorithm2e}
\begin{document}
\begin{algorithm}[p]
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
}
\end{algorithm}
\begin{algorithm}[p]
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
}
\end{algorithm}
\begin{algorithm}[p]
\renewcommand{\thealgocf}{}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
}
\end{algorithm}
\begin{algorithm}[p]
\renewcommand{\thealgocf}{3}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
}
\end{algorithm}
\begin{algorithm}[p]
\renewcommand{\thealgocf}{4}
\caption{SA}
\KwData{Movie}
\KwResult{Classification}
\BlankLine
\Begin
{
\textbf{call Function 1: S}\;
}
\end{algorithm}
\end{document}