首先说一下latex关于排版的内部原理

latex的文档由两样元素组成

  1. 字符文本,就是我们写进去的文字内容
  2. 浮动体,默认 figure 和 table,但是我们可以定义额外的浮动体类型,比如algorithm 宏包定义了用于排版算法的浮动体。用户也可以在导言区定义自己需要的浮动体类型(借助 float 宏包)。
    (1)浮动体是一个容器(不会被分开),用于装入我们不想被分页的内容
    (2)有一个简短的描述,比如标题 \caption{xx}
    (3)有一个编号,用于引用,比如 \label{xx}

latex从xx.tex文件的前往后逐个字符读取内容,格式控制符解析,进行相应的输出显示。为了效率,采用的贪心算法,是不回溯的。纯字符文本内容,没什么好说的,但是遇到浮动体的时候,怎么办呢,文档一般讲究排版美学,所以浮动体会尽量显示到特定的浮动区域:

  1. 在同一栏(column)当中,LaTeX 设置了两个浮动区域:栏的顶部和底部。对于双栏排版来说,LaTeX 还提供了额外的区域:跨过双栏的顶部。
  2. 也有所谓的「浮动栏」或者「浮动页」的设定。顾名思义,浮动栏和浮动页就是「只有浮动体」的栏(一整栏都放多个浮动体)或者页(一整页都放多个浮动体),那么这些栏或者页,就不会放其它字符文本内容了。
  3. 也可以将浮动体放在文本内容的中间(当然,这需要显式指定)。就是前后都可以有字符文本。

latex会为浮动体指定默认浮动区域(位置选项)

  • ! 表示忽略一些严格的限制条件;比如忽略当前浮动区域允许放置浮动体的最大数量、当前浮动区域的最大面积,因此h选项更有可能生效(即 [!h]),所以排版出来就会比较丑,所以我们要慎用这个选项
  • h 表示如有可能(比如所剩的页面还够用于当前浮动体),则放在当前位置here;
  • t 表示该浮动体允许置于栏的顶部;
  • b 表示该浮动体允许置于栏的底部;
  • p 表示该浮动体允许置于浮动栏或浮动页。

我们有时候为了自己控制浮动体的位置,可以显式的传入位置选项(那么latex就不采用默认了),可以组合的传入(组合顺序没有影响,因为latex内部判断程序已经指定好了执行顺序,!,h,t,b,p)。

浮动算法的基本流程,可以大致描述如下。

  • 当 LaTeX 遇到一个浮动体,它会根据浮动算法的规则(我们显式指定的 !,h,t,b,p 位置选项)尽可能快地输出该浮动体。

    • 若成功,则该浮动体被输出,并且 LaTeX 再也不会改变它的位置。
    • 若失败,则该浮动体被 LaTeX 放在一个等待队列中暂存,而后在下一页开始的时候尝试输出队列中的浮动体。
  • 当一栏或者一页组装完毕,LaTeX 会检查等待队列中的浮动体,并尝试构建一个浮动栏或浮动页,输出尽可能多的浮动体。如果等待队列中的各个类型的浮动体,都不允许输出在浮动栏或浮动页中,则 LaTeX 会开始尝试将剩下的浮动体放在栏的顶部或者底部。如果当前页已无法容纳更多浮动体,则余下的浮动体又被加入等待队列,待输出下一页时再做尝试。
  • 之后,LaTeX 开始处理当前页的文本信息。当然,在这个过程中,LaTeX 可能会遇到新的浮动体。
  • 当 LaTeX 遇到 \clearpage/FloatBarrier 或者文档末尾时,LaTeX 会新建一个页面,而后将等待列表中的所有浮动体,都输出在浮动栏或浮动页中(而不论这些浮动体的位置选项是否指定了 p)。

注意:h 真的只表示「如果可能的话,放在这里」,如前所述,h 选项仅在一种情况下可能生效:等待列表中没有该类型的浮动体,并且当前页有足够的空间供其摆放

如果用户希望表达「我一定要放在这里」,那么需要使用 float 宏包(\usepackage{float})提供的 H 选项。此时彻底禁止某个浮动体的浮动效果,其它位置选项h,t,p等都会无效了,如果也指定了,直接运行报错。

参考文章:

LaTeX 中的浮动体:浮动算法 | 始终

Latex:图片排版的位置参数【htbp】_weixin_39450145的博客-CSDN博客_htbp


然后说一下关于latex算法排版包的介绍

一般会接触到的包有algorithm、algorithmic、algorithmicx、algpseudocode、algorithm2e这5个包。

algorithm用于给伪代码提供一个浮动体容器,从而不会被分页显示。

algorithmic用于编辑伪代码的内容,一些for、while、if等语句通过该包中的命令进行编写。

algorithmicx可以看作algorithmic的升级版,提供了一些自定义命令

algpseudocode是algorithmicx的布局layout辅助
algorithm2e则是独立于algorithmic和algorithmicx的另一套伪代码环境,两套环境语法、排版上均不相同

下面是需要导入的包的3种情况:

  • algorithm + algorithmic:第一代算法排版包,用的人多
  • algorithm + algorithmicx + algpseudocode(内部已经导入了algorithmicx包):第二代算法排版包,用的人也多。显示效果和第一代一样的。但是支持注释,建议用这个
  • algorithm2e:第三代算法排版包,用的人少也支持注释

参考文章:

LaTeX伪代码写法总结_Zerg_Wang的博客-CSDN博客_latex 伪代码

Latex 算法怎么写?(一):algorithm, algorithmic算法包到底什么区别? - 知乎


上面虽然有三种使用情况,我们发现实际上第二种和第一种显示效果一样的,因此论文中最常见到的就是第二种和第三种,这两种风格:(下面的代码都是overleaf(一个在线latex编写网站,很出名)能运行通过的)

1. 不能带竖线的形式(用的人多)

latex代码如下:

%这种形式需要在前面 导入包(第二代)
\usepackage{algorithm}
\usepackage{algpseudocode}
%或者替换为\usepackage{algorithmic},就是第一代了,
%但是关键字全部是大写形式,比如 \State 改为 \STATE%将官方的 require 和 ensure 关键字换成我们常用的 input 和 output
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}%排版代码为
\begin{algorithm}[h]\caption{bool DM improve($S_H$)}\label{alg::conjugateGradient}\begin{algorithmic}[1]\RequireReal-time task set $S_H$\EnsureThe schedulability of $S_H$\State $D=0$;\For {${\tau _i}:{S_H}$}          %For循环结构\State $D = D+C_i/D_i$;\EndFor\If {$D > n$}\State return  false;\Else\State return true;\EndIf\end{algorithmic}
\end{algorithm}

想要添加注释,需要宏包
\usepackage{algpseudocode}
也就是,第二代排版,才支持注释

然后排版代码添加 \Comment{step 1}

效果如下:会自动右对齐


2. 可以带竖线的形式(我觉得更好看)

latex代码如下:

%防止与已有包冲突
\makeatletter
\newif\if@restonecol
\makeatother
\let\algorithm\relax
\let\endalgorithm\relax%引入伪代码模块需要的包,第三代
\usepackage[linesnumbered,ruled,vlined]{algorithm2e}%[ruled,vlined]{%\usepackage[ruled]{algorithm2e} %带竖线
%\usepackage[ruled,vlined]{algorithm2e} %带竖线和折线
%\usepackage[linesnumbered,boxed]{algorithm2e} %方框格式
%\usepackage[lined,algonl,boxed]{algorithm2e} %可以显示EndIf等%排版代码如下
\begin{algorithm}[H] %如果不能显示,这里要把[H]给加上就行了“H”是指定伪代码浮动体的位置\caption{bool DM improve($S_H$)}\KwIn{Real-time task set $S_H$}\KwOut{The schedulability of $S_H$}$D=0$\;\For{${\tau _i}:{S_H}$}{$D = D+C_i/D_i$}\If{$D > n$}{return  false\;}\Else{return  true\;}
\end{algorithm}

添加注释,只需要用下面的命令即可

\tcp{not aligned comment},不需要引入其它包或者命令

\If(\tcp*[h]{not aligned comment}){${R_i}$},,有If时候加这儿

如果想和上面第一种一样,都是自动右对齐或者左对齐,都需要额外引入一些命令,我感觉挺麻烦的,有兴趣的自己去试试吧。(因为我们手动敲空字符去实现对齐,也是可以实现的,就不整那些复杂的了。)

自动右对齐:

latex - Algorithm left margin and Comment Customizing - Stack Overflow

另外还有一个,左对齐形式,也可以参考一下:horizontal alignment - Align comments in algorithm with package algorithm2e - TeX - LaTeX Stack Exchange


注意点:

  • 这两种形式不能共存,会报错冲突的,因此导入的包只能选一种方式,即 \usepackage[ruled]{algorithm2e} 和包 \usepackage{algorithm},\usepackage{algorithmic}或者\usepackage{algpseudocode} 会冲突,选其一
  • 有些期刊的模板,只有一种能运行通过,且成功显示。不然要么编译始终报错,要么就是运行后算法显示不出来。这两种情况我都遇到过,深有体会。这时候记得换另外一种算法排版,一般都能解决了。
  • 使用第一种伪代码模板,我最开始遇到了 ! Undefined control sequence.报错,这是因为latex代码中,该伪代码模板中关键字要么全部使用大写,要么全部大写开头而已,即,一定要统一,就不报错了。
  • \usepackage[xx]{package},导入包这里是加选项的作用,上面两种算法排版包,都有各自的选项,自己去搜一下,看看都是什么作用(网上也有很多例子,自己选一个好看的就行了)。比如algorithm2e排版形式(也就是第二种)的命令都是这样指定的。但是第一种形式,begin algorithmic这一行后面还能添加一些命令选项的,比如[1]:表示每行都编号,[2]:表示两行编号一次。
  • 有些期刊,算法排版的位置选项,我不指定,或者指定 ! , h,t,p等都不能显示出来这个算法,但是加了 [H],从上面可知,就是强行指定为当前位置,就能显示出来这个算法了,很奇怪。即,必须这样 \begin{algorithm}[H],我也搞不懂为什么。

其它小技巧:

让一行中的一部分右对齐使用\hfill命令,例如在伪代码中(但是对于for等关键字之后就不能用了)

\State Estimate   \hfill $\rhd$Update
效果为

参考博客列表:

Algorithmic和Algorithm环境_辉的博客-CSDN博客

LaTeX基本技巧_gsgbgxp的博客-CSDN博客_latex state

latex排版原理 常用算法排版伪代码模块 添加注释以及注意事项相关推荐

  1. 经典常用算法/常用算法思维---附伪代码以及实现

    本篇文章旨在分享一些常用算法的伪代码以及部分算法的具体实现,后面也会更新我在刷算法题中学到的或者从别的地方看到的经典算法思维 本博客并不提供算法说明,算法证明,算法分析,算法测试等内容,只提供算法的伪 ...

  2. 计算机排版基础知识,计算机排版基础知识.pdf

    计算机排版基础知识.pdf 计算机排版基础知识 1.主要教学内容: 1.1 计算机排版系统的应用环境 1.2 版面的结构及常见的排版规则 1.3 知识点:掌握版面结构及名词术语.熟悉常见出版物的版心 ...

  3. 【Latex】算法排版规律(中文排版)

    参考资料: <algorithm, algorithmic算法包到底什么区别?> <Latex写算法的伪代码排版> <Latex 编写算法伪代码,基于algorithmi ...

  4. latex中怎么设置每一行文字都对齐_排版系列教程 | LaTeX,为学术论文排版而生【浮动体篇】...

    今天,迎来LaTeX系列的第四篇[浮动体篇].LaTeX作为最优秀的排版语言,非常值得大家学习,对LaTeX感兴趣朋友可以点个关注,后面持续更新! 关于LaTeX,今天和大家多唠叨一点. 与主流的编程 ...

  5. Latex入门篇之论文排版

    Latex入门篇 1. 概述 1.1 Latex作用 1.2 初识Latex 2. Latex模板的使用 3. Latex排版的正经讲解 3.1 关于tex File文件 3.2 关于普通文本 3.3 ...

  6. Latex在同一figure中排版多张图片的方法

    Latex在同一figure中排版多张图片的方法 主要使用了minipage(子图)语法.minipage可以嵌套,子图还可以分解为更多子图,功能很好玩,无聊可以自己试试.下面介绍几种常用效果的实现方 ...

  7. scikit-learn机器学习常用算法原理及编程实战(五)

    决策树 决策树是最经典的机器学习模型之一.预测速度快,可以处理类别型数据和连续型数据.通过本章读者可以掌握以下内容: 信息熵及信息增益的概念,以及决策树的分裂的原则: 决策树的创建及剪枝算法: sci ...

  8. 排版设计常用术语和常识

    本篇文章主要介绍排版设计过程中涉及到专用术语介绍,对于从事出版工作及设计工作的人士来说掌握这些尤为重要,下面就让我们一起来了解.掌握这些知识吧! ∷  封面(又称封一.前封面.封皮.书面) 封面印有书 ...

  9. 计算机排版原理,课后作文的计算机排版原理.ppt

    这是精心收集的精品经典资料,值得下载保存阅读! ● 小结 计算机系统概述 ● 1.1 计算工具及其进步 ● 1.2 0.1编码 ● 1.3 电子数字计算机工作原理 ● 1.4 现代计算机系统结构与发展 ...

最新文章

  1. 解读互联网40年中的10大“杀手”病毒
  2. 有没有必要开项目周会
  3. Nacos-服务多级存储模型
  4. python观察日志(part15)--命名元祖namedtuple
  5. java ftp 关闭连接_java - 使用Java Apache FTPClient进行FTP TLS获取“握手时远程主机关闭连接”[重复] - 堆栈内存溢出...
  6. spring cloud zuul 原理简介和使用
  7. Spring : Spring 深入理解lombok
  8. React—Native开发之 Could not connect to development server(Android)解决方法
  9. TestNG Eclipse插件
  10. RabbitMQ WEB管理端
  11. C#:系统学习笔记(一)MVC基础篇
  12. PDF 文件如何转换从可以编辑的文本和word
  13. 微信协议简单调研笔记 (2)
  14. Reflect的理解
  15. 领导科学 读书笔记(一)
  16. VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
  17. C++Primer_Chap16_模板和泛型编程_List01_定义模板_笔记
  18. html移动端适配最优方法
  19. 分享一个优雅的vi配置
  20. MichiGAN:Multi-Input-Conditioned Hair Image Generation for Portrait Editing---论文阅读笔记

热门文章

  1. 云桌面真的可以完全代替PC电脑吗?
  2. 【报告分享】数观食机|2020快手食品行业数据价值报告-磁力引擎-202103.pdf(附下载地址)
  3. html5+css3笔记整理
  4. php微信公众号支付实例教程,php微信支付之公众号支付功能
  5. 定时任务(每晚12点执行)
  6. 「游戏建模」3DMAX渲染慢的解决小技巧
  7. 美团智能配送系统的运筹优化实战-笔记
  8. 2021年中国开源优秀人物揭晓
  9. office2020与2016版的不同_不同的office哪个版本最好用,比如Office 2016 和 Office 2013?...
  10. Incapsula-国外的免费的CDN内容分发服务