LaTeX去除算法编号的方法

最近在使用 LaTeX \LaTeX LATEX完成算法设计大作业(写一篇论文综述)时,遇到了算法编号去除的问题,现总结如下

PS. 算法内容是随便打的,错了不要在意

目录

  • 对于algorithm宏包
    • 方法一
    • 方法二
    • 方法三
  • 对于algorithm2e宏包
    • 方法一
    • 方法二
    • 方法三

对于algorithm宏包

首先给出一个有编号的算法例子:
源码:

\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}

截图如下:LaTeX去除算法编号的方法_第1张图片

方法一

最简单的方法是将计数器归零。
即添加代码

\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}

截图如下:
LaTeX去除算法编号的方法_第2张图片
不过这个方法有一个小缺点

当这串代码放在导言区会使得整篇文章的编号都没有;放在某个算法之前会使得之后的算法没有编号(如一共有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}

截图如下:
LaTeX去除算法编号的方法_第3张图片

方法三

和方法二类似,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}

截图如下:
LaTeX去除算法编号的方法_第4张图片

对于algorithm2e宏包

首先,页给出一个有编号的算法例子:
源码:

\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}

截图如下:
LaTeX去除算法编号的方法_第5张图片

方法一

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}

截图如下:
LaTeX去除算法编号的方法_第6张图片
然而这种方法对于三线表格式的算法不管用,如果强行使用,效果就会如下:
LaTeX去除算法编号的方法_第7张图片
这显然不是我们想要的结果。

方法二

我们可以定义两个宏:

\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}

截图如下:
LaTeX去除算法编号的方法_第8张图片
如果想要回复编号可以使用\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}

截图如下:
LaTeX去除算法编号的方法_第9张图片

方法三

查看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}

截图如下:
LaTeX去除算法编号的方法_第10张图片
同样,该方法也存在于对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}

截图如下:
LaTeX去除算法编号的方法_第11张图片

你可能感兴趣的:(LaTeX学习,latex,算法)