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

首先说一下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]
    \Require
      Real-time task set $S_H$
    \Ensure
      The 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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值