LaTeX 算法与代码环境
算法环境 algorithm2e
在LaTeX中使用伪代码来描述算法是常见的需求,LaTeX其实有很多类似名称的宏包,简单辨析一下:(参考 知乎上的一个回答 )
总得来说通常有两条路子可以选择:
下面主要考虑第一个方式,即使用algorithm2e宏包。
导入algorithm2e宏包时通常顺便加上如下选项
1 |
\usepackage[ruled,linesnumbered,noline]{algorithm2e} |
算法的主体框架如下,可以添加标题(caption)和标签(label)
1 |
\begin{algorithm} |
一个简单的例子:
1 |
\begin{algorithm} |
算法的每一行语句可以使用
\;
结尾,这会在文本中加上分号结尾并换行,还可以使用
\\
强行换行。
除此之外,下面的某些固定语法结构也会导致换行。
算法内部需要数学表达式时,仍然需要
$$
等来创建数学环境。
算法通常需要使用下面这些预定义宏:
\KwIn{<input>}
\KwData{<input>}
\KwOut{<output>}
\KwResult{<output>}
\KwTo
\KeRet{<value>}
或等效的
\Return{<value>}
循环:包括下面几种形式,其中含
l-
前缀的版本是行内形式,即内部不产生换行(但结尾仍然有换行)
1 |
\For{<condition>}{<text loop>} |
条件:包括下面几种形式,默认形式会产生换行并使用end结尾;含
l-
前缀的版本是行内形式,即内部不产生换行(但结尾仍然有换行);含
e-
前缀的eIf自带真假两个分支;含
u-
前缀的版本是未完成形式,即结尾不含end,需要搭配其他命令来收尾
1 |
\If{<condition>}{<then block>} |
注释:默认支持两类注释,即
tcc
(C语言风格
/**/
)和
tcp
(C++风格
//
)注释,有几个选项会调整注释的细节,这里略去
1 |
\tcc{<comment>} |
对于循环和条件结构的呈现,还涉及到如下几个选项:
这几个选项既可以在宏包选项中设置,也可以使用下面的命令设置
1 |
\SetAlgoLined |
在循环和条件结构中,都支持加上括号包裹的注释选项,例如
1 |
\lIf (\tcc*[h]{lif comment}){test}{ |
宏包还支持自定义一些宏,例如下面定义了与IO宏类似的一个命令
\KwPara{<input>}
,代表算法需要的各种细节参数
1 |
\SetKwInput{KwPara}{Parameter} |
除了这个宏包之外,还可以使用其他方式来实现,例如导入algorithm和algpseudocode这两个宏包,本文暂不讨论具体细节,不过可以明确的是,它的命令风格与algorithm2e是截然不同的。
整理一下LaTeX关于源代码显示的命令,注意这与算法(伪代码)环境的需求是不一样的。
抄录环境 verbatim
LaTeX直接提供verbatim抄录环境,在其中以等宽字体原样排版代码,回车和空格是正常的换行和空位的作用,缩进也是原样保留的;带星号的版本更进一步将空格显示为
␣
。使用示例如下
1 |
\begin{verbatim}
|
注意这不是代码环境,因为它只是原样输出,并没有提供编程语言的语法高亮功能。
还有与之类似的行内抄录片段或关键字的
\verb
命令
1 |
\verb<delim><code><delim> |
与常见的命令不同,
\verb
需要提供自定义的分界符delim来标明代码的前后分界位置,要求前后分界符必须一致,除字母、空格或星号外,
可任意选择使得不与代码本身冲突的符号(习惯上使用
|
符号),例如
1 |
\verb+(a || b)+ %(a || b) |
代码环境 listings
listings宏包是一个功能强大也非常复杂的宏包,用于提供特定编程语言的语法高亮,但是默认的显示字体很丑,排版也很丑,需要经过一番配置才能达到美观的语法高亮显示效果。
1 |
\usepackage{listings} |
通常需要搭配提供颜色的xcolor宏包使用(xcolor是color宏包的增强版)
1 |
\usepackage{xcolor} |
可以定义新的颜色
1 |
\definecolor{dkgreen}{rgb}{0,0.6,0} |
颜色的使用例如
\color{gray}
。注意上面的小写rgb接受的参数为0-1的小数值,而大写RGB接受的是0-256的整数值。
行内代码片段展示:
\lstinline|<codes>|
,与
\verb
命令类似,它的分界符可以是任意的,从而避免与代码中的字符冲突,例如
1 |
\lstinline!var i:integer;! |
主要用法是导入代码块
1 |
\begin{lstlisting} |
也支持从文件中导入代码块(可以设置起止行号来导入源文件中的片段)
1 |
\lstinputlisting[language=Python]{main.py} |
\lstlistoflistings
命令会将所有添加caption的代码块生成代码目录。
配置既可以在导入特定环境时指定,也可以在导言区进行全局默认设置,在具体环境中以可选参数的形式给出配置,例如
1 |
\begin{lstlisting}[ |
或者可以在导言区进行全局默认配置,例如
1 |
\lstset{ |
例如
1 |
\lstset{ |
其中常见的选项:
language=Python,C++
,支持多个语言,注意名称要用C++而非Cpp
basicstyle = \ttfamliy
,这是指定等宽字体(建议)
keywordstyle=\bfseries \color[RGB]{40,40,255}
,通常指定一个颜色
commentstyle=\color[RGB]{0,96,96}
,
通常指定一个颜色
stringstyle=\color[RGB]{128,0,0}
,
通常指定一个颜色
numberstyle=\footnotesize
,这可以让行号的字体更小一点
identifierstyle=\color{black}
,标识符的颜色字体等
morekeywords={eg1,eg2}
,这可以加入自定义关键词,默认的不太全
breaklines=true
,建议,否则过长的行会直接截断!
numbers=left
,支持left/right/none,默认为none不显示
stepnumber=5
firstnumber=10
,设置为last则继承上一个代码环境的行号
columns=flexible
,让不同列之间的距离自适应,反之可以使用
fixed
设置固定距离
showstringspaces=false
,否则默认会在某些空格处显示下划线
showtabs=true
,会将tab显示为长的下划线,默认不显示(只展示连续空格)
tabsize=8
,默认长度为8个空格
frame=single
,single显示单边框,shadowbox为阴影框,默认是none无边框
backgroundcolor=xxx
name=xxx
,同名的代码块行号会自动延续
caption=Name
,还可以指定名称的显示位置(默认在顶部),例如
captionpos=b
改在底部,caption会自动编号,如果不需要编号,可以使用
title=xxx
,如果同时出现则会显示后设置的项
escapeinside={\%*}{*)}
除此之外,还可以定义一套新的样式(而非设置默认样式)用于指定语言,例如
1 |
\lstdefinestyle{cppStyle}{ |
使用例如
1 |
\begin{lstlisting}[style=cppStyle] |