想在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算法行。
說明:為什么沒有使用algorithm2e和clrscode宏包。
1)algorithm2e產生的算法像圖片和表格一樣,是浮動的;
2)algorithm2e產生的算法不能跨頁;
3)algorithm2e產生的算法,處理超長行時能自動換行,但不能實現懸掛縮進;
4)clrscode產生的算法風格很好很獨特,但個人還是喜歡在for、while、if之后有end的算法書寫方式;
5)clrscode產生的算法不能處理超長行;
6)clrscode產生的算法不能跨頁。
在bbs.ctex.org上發帖詢問,經過LeoLiu的幫助,終于實現所要求的算法版式。原帖見http://bbs.ctex.org/forum.php?mod=viewthread&tid=62650。下面貼出代碼及排版效果圖,與大家共享。
\documentclass{article}
% Thanks to LeoLiu at http://www.ctex.org.
\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}%
\def\linooffset{\item\hangafter1\hangindent1em\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的全角半角轉換功能將上述代碼轉成半角。方法:WORD“開始”按鈕欄中點擊“大小寫轉換”,在下拉菜單中選擇“全角”或“半角”。)
最后實現的排版效果如下所示:
轉載本文請聯系原作者獲取授權,同時請注明本文來自張鵬科學網博客。
鏈接地址:http://blog.sciencenet.cn/blog-482332-417364.html
下一篇:用Latex寫線性規劃
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态