用LaTeX优雅地书写伪代码:Algorithm2e简明指南
点击蓝字
关注我们
作者丨薰风初入弦
来源|https://zhuanlan.zhihu.com/p/166418214
本文已获作者授权,禁止二次转载
极市导读
LaTeX作为理工科科研人员的必备工具,熟练掌握可以极大地提高论文写作的效率。本文介绍了一个好用的工具包,帮助你优雅地书写伪代码。
1. 准备
该工具包的使用手册下载地址:http://mlg.ulb.ac.be/files/algorithm2e.pdf
\usepackage[ruled,linesnumbered]{algorithm2e}
使用宏包时中括号的参数含义:
ruled
是让标题显示在上面,否则算法的标题则在下面。linesnumbered
让算法中显示行号。还可以添加
boxed
, 让算法排版时插入在一个盒子里。
2. 基本语法
书写代码时也有一些专门的命令:
强烈建议知乎支持Markdown表格
EX:
如果你不想让你的伪代码叫做 'Algorithm 编号', 可以使用
\renewcommand{\algorithmcfname}{算法名}
命令来修改。除了\If, \Else, \ElseIf之外,还有\uIf, \lIf, \uElse, \lElse, \uElseIf, \lElseIf等命令,他们的区别在于
\If, \Else, \ElseIf都是会以end结尾
\uIf, \uElse, \uElseIf, 是不以end结尾的块级元素
\lIf, \lElse, \lElseIf 是不以end为结尾的行内元素
在If-else结构中,\eIf 自带else(即 if 和 else 共用一个 end),而只是用 \If 和 \Else 的话则会多出一个end给Else。
3. 例子
这些例子可以直接放在一个空的.tex文件中进行编译。
例子1
来自官方文档的,什么都没有的原始例子
\def\SetClass{article}\documentclass{\SetClass}\usepackage[lined,boxed,commentsnumbered]{algorithm2e}\begin{document}\begin{algorithm}[H] \SetAlgoLined \KwData{this text} \KwResult{how to write algorithm with \LaTeX2e }initialization\; \While{not at end of this document}{ read current\; \eIf{understand}{ go to next p\; current p becomes this one\; }{ go back to the beginning of current p\; } } \caption{How to write algorithms}\end{algorithm}\end{document}
例子2
现在,我们在输入输出中间加一点点间隔,然后给算法的某些行进行强调,再给if条件加上注释呢
\def\SetClass{article}\documentclass{\SetClass}\usepackage[linesnumbered,lined,boxed,commentsnumbered]{algorithm2e}\begin{document}\IncMargin{1em}\begin{algorithm} \SetKwData{Left}{left}\SetKwData{This}{this}\SetKwData{Up}{up} \SetKwFunction{Union}{Union}\SetKwFunction{FindCompress}{FindCompress} \SetKwInOut{Input}{input}\SetKwInOut{Output}{output}\Input{A bitmap $Im$ of size $w\times l$} \Output{A partition of the bitmap} \BlankLine \emph{special treatment of the first line}\; \For{$i\leftarrow 2$ \KwTo $l$}{ \emph{special treatment of the first element of line $i$}\; \For{$j\leftarrow 2$ \KwTo $w$}{\label{forins} \Left$\leftarrow$ \FindCompress{$Im[i,j-1]$}\; \Up$\leftarrow$ \FindCompress{$Im[i-1,]$}\; \This$\leftarrow$ \FindCompress{$Im[i,j]$}\; \If(\tcp*[h]{O(\Left,\This)==1}){\Left compatible with \This}{\label{lt} \lIf{\Left $<$ \This}{\Union{\Left,\This}} \lElse{\Union{\This,\Left}} } \If(\tcp*[f]{O(\Up,\This)==1}){\Up compatible with \This}{\label{ut} \lIf{\Up $<$ \This}{\Union{\Up,\This}} \tcp{\This is put under \Up to keep tree as flat as possible}\label{cmt} \lElse{\Union{\This,\Up}}\tcp*[h]{\This linked to \Up}\label{lelse} } } \lForEach{element $e$ of the line $i$}{\FindCompress{p}} } \caption{disjoint decomposition}\label{algo_disjdecomp}\end{algorithm}\DecMargin{1em}\end{document}
例子3
实际上,咱们用的最多的格式(论文里常见)就还是这种:
\def\SetClass{article}\documentclass{\SetClass}\usepackage[ruled,linesnumbered]{algorithm2e}\begin{document}\begin{algorithm}\caption{Simulation-optimization heuristic}\label{algorithm}\KwData{current period $t$, initial inventory $I_{t-1}$, initial capital $B_{t-1}$, demand samples}\KwResult{Optimal order quantity $Q^{\ast}_{t}$}$r\leftarrow t$\;$\Delta B^{\ast}\leftarrow -\infty$\;\While{$\Delta B\leq \Delta B^{\ast}$ and $r\leq T$}{$Q\leftarrow\arg\max_{Q\geq 0}\Delta B^{Q}_{t,r}(I_{t-1},B_{t-1})$\;$\Delta B\leftarrow \Delta B^{Q}_{t,r}(I_{t-1},B_{t-1})/(r-t+1)$\;\If{$\Delta B\geq \Delta B^{\ast}$}{$Q^{\ast}\leftarrow Q$\;$\Delta B^{\ast}\leftarrow \Delta B$\;}$r\leftarrow r+1$\;}\end{algorithm}\end{document}
例子4
Algorithm2e本身不支持Do-While结构(支持的是While-Do),需要自行定义。不过自行定义并不难,因为宏包中内置了Repeat-Until结构,在Algorithm2e中是“宏指令(Repeat macros)”的一种[1]
自定义宏指令
\SetKwRepeat{Do}{do}{while}
定义完之后,就可以在伪代码块中使用如下命令调用
\Do{<结束条件>}{<执行命令>}
完整例程:
\documentclass{article}\usepackage[linesnumbered, ruled]{algorithm2e}\SetKwRepeat{Do}{do}{while}%\begin{document}
\begin{algorithm}[H] \KwData{this text} \KwResult{how to write algorithm with \LaTeX2e } initialization\; \While{not at end of this document}{ read current\; \Repeat{this end condition}{ do these things\; } \eIf{understand}{ go to next p\; current p becomes this one\; }{ go back to the beginning of current p\; } \Do{this end condition}{ do these things\; } } \caption{How to write algorithms}\end{algorithm}
\end{document}
写在最后
LaTeX,说难也难,说不难也不难。
说它难,是因为其本身相当于一种较为独立的编程语言。熟练的掌握它,需要将以往我们在Word中“所见即所得”的写作思维彻底转变为“所想即所得”的思维。
但是,它也很简单。实际上,我从下载第一个CTeX包,到本科第一篇论文写出来,只花了三天。LaTeX虽然涉及很多复杂与繁琐的设定,但是如果只是想粗略地入个门,只需要一个手把手带你配环境的小白向教程以及一个可以作为工具书查阅的工具书即可。(当然,系统学习LaTeX将会让你之后写论文的速度和版面美观度突飞猛进)
针对那些TeX小白用户,或者不太熟练的用户,我首先推荐我同门师兄小鱼学长写的教程~
白小鱼:【小白向】LaTeX 中文入门
https://zhuanlan.zhihu.com/p/58293008
最后,LaTeX作为理工科科研人员的必备工具,熟练掌握可以极大地提高论文写作的效率。所以不论你是为了给日后宝贵的实验节省时间,还是为了更加优美地排版出想要的书籍,拥有一本详尽且好懂的LaTeX教程,总比遇到问题了和无头苍蝇乱撞一样翻知乎和博客来得高效。
因此,我在这里推荐我当时入门LaTeX使用的教材,可以在学有余力的时候系统性学习也可以在遇到问题时作为高效查阅的工具书:《LATEX入门》(刘海洋著)
参考文献
https://zhuanlan.zhihu.com/p/105582648
https://blog.csdn.net/robert_chen1988/article/details/71512914
https://blog.csdn.net/yq_forever/article/details/89815562
参考
1.https://tex.stackexchange.com/questions/212301/do-while-loop-in-algorithm2e
更新于2020/8/10:感谢@纯粹大佬的补充,Algorithm2e本身不支持Do-While结构(支持的是While-Do),需要自行定义。具体的定义方法请见最后一个例子。
觉得有用麻烦给个在看啦~
用LaTeX优雅地书写伪代码:Algorithm2e简明指南相关推荐
- 如何优雅地书写英文文章
如何优雅地书写英文文章 文章主要内容节选自 Nick Higham 在京的一个Talk,外加自己的一些思考. 为什么要好好写文章 1.让你文章更容易被接收 2.展现你的交流技巧 3.好好地写作,写完之 ...
- TexStudio 编辑 Latex 时插入算法伪代码描述块一直报错:Missing \endcsname inserted. \While
问题描述 使用 TexStudio 编辑 latex 时插入算法伪代码描述块一直报错:Missing \endcsname inserted. \While,如下图: 原因分析 谷歌了很多资料,该删的 ...
- git - 简明指南
助你入门 git 的简明指南,木有高深内容 ;) Tweet 作者:罗杰·杜德勒 感谢:@tfnico, @fhd 和 Namics 其他语言 english, deutsch, español, ...
- WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因 WGCNA 系列 WGCNA 简明指南|1. 基因共表达网络构建及模块识别 WGCNA 系列 参考 关联模块与临床特征 量化module- ...
- WGCNA 简明指南|1. 基因共表达网络构建及模块识别
WGCNA 简明指南|1. 基因共表达网络构建及模块识别 参考 简介 数据导入.清洗及预处理 数据导入 检查过度缺失值和离群样本 载入临床特征数据 自动构建网络及识别模块 确定合适的软阈值:网络拓扑分 ...
- [201206][UML 精粹][标准对象建模语言简明指南][第3版][Martin Fowler][著]
[201206][UML 精粹][标准对象建模语言简明指南][第3版][Martin Fowler][著][UMLChina][潘加宇][译] 第 1 章 简介 1.1 UML 是什么 1.2 使用 ...
- WGCNA 简明指南|3.使用WGCNA实现网络可视化
WGCNA 简明指南|3.使用WGCNA实现网络可视化 WGCNA 系列 WGCNA 简明指南|1. 基因共表达网络构建及模块识别 WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因 WGC ...
- latex 伪代码 algorithm2e方式
一.怎么用: [paper]latex使用algorithm工具包实现伪代码排版_妈妈咪咦的博客-CSDN博客_algorithm包 latex 二.Latex 中伪代码编译通过,但是在pdf文档中不 ...
- 前端通信:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码(改迭代已作废,移步迭代10)...
该迭代已作废,最新的请移步这里:https://www.cnblogs.com/GerryOfZhong/p/10726306.html 距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这 ...
最新文章
- 张钹院士:制约人工智能发展的最大困难是什么?
- spring中控制器和服务层校验的实现原理
- 基于内存数据库的分布式数据库架构
- matlab 由图片生成视频
- C#写爬虫,版本V2.1
- 宝塔面板干什么用的?
- 彻底解决乱码问题(一):为何会出现乱码
- 页面http 405错误排查
- Cox回归和HR值理解要点难点,实例讲解
- 车牌识别对于智慧城市的重要性
- 有关于计算机技术节日名称,三月份有关计算机的节日
- Idea设置全白色 背景
- 简单C语言的框架结构
- Qt焦点事件 setFocusPolicy
- 小博老师解读经典Java面试题—Java位运算
- 冯诺依曼最伟大的发现?----元胞自动机
- Caused by: java.lang.NumberFormatException: For input string: “?2130969371“
- Rasa 3.x 学习系列-Rasa [3.4.1] - 2023-01-19新版本发布
- 在线淘礼金免单采集网网站源码
- 【19调剂】国家211工程大学、世界一流学科建设高校-福州大学,硕士研究生预调剂通知...