LaTeX 的所有宏包文件都要写在 \documentclass
命令之后和\begin{document}
之前。在本文中,我们主要会用到如下的两个宏包:
\usepackage{algorithmic}
\usepackage{algorithm}
在论文写作的过程中,对于计算机专业的学生,在论文中插入伪代码描述所用的算法还是比较常见的。这里我们先体验一下伪代码算法插入模板的效果,然后在后面详细讲解模板的中的每个细节。
我们比较通用的模板如下:
\begin{algorithm}[!h]
\caption{algorithm of SUM}
\label{alg:AOA}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\begin{algorithmic}[1]
\REQUIRE $A$, $B$, $C$ %%input
\ENSURE EEEEE %%output
\STATE AAAAA
\WHILE{$A=B$}
\STATE BBBBB
\ENDWHILE
\FOR{each $i \in [1,10]$}
\IF {$C = 0$}
\STATE CCCCC
\ELSE
\STATE DDDDD
\ENDIF
\ENDFOR
\RETURN EEEEE
\end{algorithmic}
\end{algorithm}
上述模板的展示效果如下:
1、算法排版框架
\begin{algorithm}[!t]
...
\end{algorithm}
整体大框架明确了伪代码或算法结构的开始(\begin)和结束(\end)的位置,而 algorithm 说明插入的内容是算法。[!h] 是算法的摆放格式:在当前位置(hear),所有的格式和图片、表格相同。
2、标题与标签
\caption{Algor of ABC}
\label{alg:AOA}
caption 是算法的标题。{ }中就是标题展示的具体内容,标题也会有编号,一般都是自动编号。label 是标签,标签主要是在引用的时候会用到。
说明:有时候,我们喜欢强调标签是属于算法标签,所以这里使用 alg:AOA
,而不是直接使用 AOA
作为标签。
3、设置输入和输出
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
算法一般是需要输入和输出的,我们重新替换掉上面定义的两个命令:
\algorithmicrequire
\algorithmicensure
所以修改之后,应该明白上面两行命令的含义了。我们使用的命令:\renewcommand{}{}
,第一个大括号是修改前的命令,第二个大括号是修改后的命令。\textbf是命令文本的格式(加粗)。
如果这条语句适用于所有的算法,那么我们就可以把这条语句和引用包的命令放在一起:
这就是全局设定的命令,所有用到该命令的算法都要遵守这个设定。在每个具体的算法中,我们就不需要使用这个命令了。但如果在算法中使用了这个命令,就会优先按照这个命令来。而其他没有使用这个命令,就是用前面全局设定的命令。
4、算法内容框架
\begin{algorithmic}[1]
\end{algorithmic}
这一对是算法内容的框架,表示算法的具体实现以伪代码的形式写在这里。
后面有个参数,参数中一般都写1,这个1表示具体算法内容前面的序号是每几行语句标一次序号,一般我们都是每一行算法语句都要,所以是1。
5、输入输出
\REQUIRE $A$, $B$, $C$ %%input
\ENSURE EEEEE %%output
这一整块就是输入参数和输出参数。其中,\REQUIRE 命令表示输入,\ENSURE 命令表示输出。
6、算法内容
如果算法中不需要输入和输出这两条语句,那我们这两条语句就不用写在算法中,显示的效果就只有算法的内容了。
\STATE AAAAA
\WHILE{$A=B$}
\STATE BBBBB
\ENDWHILE
\FOR{each $i \in [1,10]$}
\IF {$C = 0$}
\STATE CCCCC
\ELSE
\STATE DDDDD
\ENDIF
\ENDFOR
\RETURN EEEEE
这一整块就是算法的内容了。每一条独立的语句,前面都要添加命令\STATE
。除此之外,我们最常用的还有判断语句、循环语句和返回语句。
算法的引用要用到的命令 /ref
,如果要调用上面的算法,就可以这样调用:
As show in algorithm \ref{alg:AOA}
命令大括号中的就是算法的标签,执行结果如下:
有些时候,我们想用的不是 algorithm ,例如我们想写智能合约,就希望是下面这种样式:
只需要在使用前添加一行:\floatname{algorithm}{Contract}
\floatname{algorithm}{Contract}
\begin{algorithm}[!h]
\caption{Cont of ABC}
\label{alg:AOA}
\begin{algorithmic}[1]
\STATE AAAAA
\end{algorithmic}
\end{algorithm}
在算法的伪代码书写模式中有一些常用的语句,比如:条件分支、循环结构等。这些语法的使用要用到 algorithmic 宏包,即:\usepackage{algorithmic}
。
IF 条件判断的结构如下:
\IF {条件}
\STATE 语句1
\ELSE
\STATE 语句2
\ENDIF
这个语句块的含义就是:如果条件成立,则执行语句1,否则执行语句2。
如果我们不用考虑条件不成立,那么我们就可以省略 ELSE,直接写如下的语句块:
\IF {条件}
\STATE 语句1
\ENDIF
有两个以上的情况分支,就需要用到嵌套功能,即在一个判断语句中再写一个判断语句,例如:
\IF {条件1}
\STATE 语句1
\ELSE
\IF{条件2} \STATE 语句2
\ELSE \STATE 语句3
\ENDIF
\ENDIF
for循环语句主要用于那些具有明确循环次数和范围的循环语句,例如有如下的几种情况:
\FOR{循环条件}
\STATE 循环语句
\ENDFOR
这里以 1 到 100 以内所有整数之和为例:
\STATE $Sum = 0$
\FOR{each $i \in [1,100]$}
\STATE $Sum = Sum + i$
\ENDFOR
执行结果如下:
while循环主要用于那些循环次数不确定的,直到满足某个条件退出的,while循环格式如下:
\WHILE{条件}
\STATE 循环语句
\ENDWHILE
举个例子:计算 1 到 2021 的整数和。
\begin{algorithm}[!h]
\caption{Sum}
\label{alg:Sum}
\begin{algorithmic}[1]
\STATE $s = 0$, $i = 1$
\WHILE{$s<2021$}
\STATE $s = s+i$
\STATE $i++$
\ENDWHILE
\end{algorithmic}
\end{algorithm}
上面实例的执行效果如下所示: