教师博客
Latex算法排版,不同行缩进不同
发布时间:2025-04-02

想在latex中以这样的版式描述算法:

1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|

    xxxxxxxxxxxxxxxxxxxxxxx/

2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ 

3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/

4     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/

5     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|

        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|

        xxxxxxxxxxxxxxxxxx/

6     xxxxxxxxxxxxxxx/

7 xxxxxxxxxxxxx/

8 xxxxxxxxx/

 

说明:

1算法行指带标号的行,文本行指行文产生的行,如上段算法描述中有8 个算法行,11 个文本行。

2“|”表示右边界(自动换行),“/”表示硬回车(手动换行)。

(将上述算法版式复制到记事本中,可发现右边界实际上都是垂直对齐的。)

 

要求:

1)算法不浮动,能够跨页;

2)每个算法行的行号都在最左端,垂直对齐,连续编号;

3)每个算法行到达右边界(用“|”表示)后,自动换行;且该算法行的后续文本行均向右缩进若干(比如2个字符)距离,其版式类似于Word中的“悬挂缩进”;参见第1、第5 算法行;

4)每产生一次嵌套,嵌套的算法行除标号外,均整体向右缩进若干(比如4个字符)距离;参见第4、第5、第6 算法行。

 

说明:为什么没有使用algorithm2eclrscode宏包。

1algorithm2e产生的算法像图片和表格一样,是浮动的;

2algorithm2e产生的算法不能跨页;

3algorithm2e产生的算法,处理超长行时能自动换行,但不能实现悬挂缩进;

4clrscode产生的算法风格很好很独特,但个人还是喜欢在forwhileif之后有end的算法书写方式;

5clrscode产生的算法不能处理超长行;

6clrscode产生的算法不能跨页。

 

bbs.ctex.org上发帖询问,经过LeoLiu的帮助,终于实现所要求的算法版式。原帖见http://bbs.ctex.org/viewthread.php?tid=62650&extra=page%3D1。下面贴出代码及排版效果图,与大家共享。

\documentclass{article}

 

% The following code is used to write algorithm.

% It is mainly due to LeoLiu at http://www.ctex.org.

% To express my thanks to LeoLiu, I name this new environment ``algleo''.

\newcounter{algleo}

\newlength{\lefttab}

\newlength{\numberoffset}

\setlength{\numberoffset}{-1em}

\newenvironment{algleo}%

  {\trivlist

   \topsep=0pt\parsep=0pt\itemsep=0pt

   \def\li{\item\refstepcounter{algleo}\makebox[0.8em][r]{\thealgleo\hspace{\numberoffset}}

       \hangafter1\hangindent1.8em\noindent}%

   \def\linonumber{\item\makebox[0.8em][r]{\hspace{\numberoffset}}

       \hangafter1\hangindent1.8em\noindent}%

   \addtolength{\lefttab}{1.25em}

   \addtolength{\numberoffset}{1.25em}

   \leftskip=\lefttab}%

  {\endtrivlist}

 

 

 

 

\begin{document}

 

\section{The Algorithm}

 

\setcounter{algleo}{0}

\begin{algleo}

\linonumber Algorithm $\cal A$.

\li \label{step - alga init}This is a normal line.

\li This is a very long line. How to use \LaTeX to deal with this line? This is a

very long line. How to use \LaTeX to deal with this line?

\li {\bf while} I want to continue {\bf do}

\begin{algleo}

    \li This is a nested normal line.

    \li This is a very long line. How to use \LaTeX to deal with this line?

    This is a very long line. How to use \LaTeX to deal with this line?

    \li {\bf for} $i \leftarrow 1$ {\bf to} 100 {\bf do}

    \begin{algleo}

        \li This is a nested normal line.

        \li This is a very long line. How to use \LaTeX to deal with this line?

        This is a very long line. How to use \LaTeX to deal with this line?

    \end{algleo}

    \li {\bf end}

\end{algleo}

\li {\bf end}

\li {\bf return} nothing.

\end{algleo}

 

In step \ref{step - alga init}, the algorithm does some initializing work.

In step \ref{step - alga init}, the algorithm does some initializing work.

\end{document}

 

(请使用WORD的全角半角转换功能将上述代码转换为半角。方法:“开始”按钮栏点击“更改大小写”按钮,在下拉菜单中选择“全角”或“半角”。)

 

最后实现的排版效果如下所示:

213150qfs5y559c26h566u.png


说明:本博文原载于科学网博客(https://blog.sciencenet.cn/home.php?mod=space&uid=482332&do=blog&id=417364),发布时间为2011年2月28日。至2025年3月27日,在科学网的点击量为54146次。

2025年4月2日,本博文复刊于作者的个人主页。

 


上一条:用Latex写线性规划

下一条:张鹏在科学网的博客

版权所有   ©山东大学 地址:中国山东省济南市山大南路27号 邮编:250100 
查号台:(86)-0531-88395114
值班电话:(86)-0531-88364731 建设维护:山东大学信息化工作办公室