LaTeX/演算法
LaTeX 有幾個軟體包可以用來以 "虛擬碼" 的形式排版演算法。與統一風格(例如,所有內容都用打字機字型)相比,它們提供了風格上的增強,因此迴圈或條件等結構在視覺上與其他文字區分開來。虛擬碼通常放在 演算法 環境中。對於排版用真實程式語言編寫的真實程式碼,請考慮 原始碼列表 中描述的 listings 軟體包。
有四個著名的軟體包:algorithmic、algorithm2e、algorithmicx 和 program,
該algorithmic包使用的命令集與algorithmicx包不同。它與revtex4-1不相容。基本命令是
\STATE <text>
\IF{<condition>} \STATE {<text>} \ELSE \STATE{<text>} \ENDIF
\IF{<condition>} \STATE {<text>} \ELSIF{<condition>} \STATE{<text>} \ENDIF
\FOR{<condition>} \STATE {<text>} \ENDFOR
\FOR{<condition> \TO <condition> } \STATE {<text>} \ENDFOR
\FORALL{<condition>} \STATE{<text>} \ENDFOR
\WHILE{<condition>} \STATE{<text>} \ENDWHILE
\REPEAT \STATE{<text>} \UNTIL{<condition>}
\LOOP \STATE{<text>} \ENDLOOP
\REQUIRE <text>
\ENSURE <text>
\RETURN <text>
\PRINT <text>
\COMMENT{<text>}
\AND, \OR, \XOR, \NOT, \TO, \TRUE, \FALSE
完整的文件列在 [2] [失效連結]。大多數命令與algorithmicx等價物類似,但大小寫不同。該軟體包algorithms bundle在 ctan 儲存庫 中,日期為 2009-08-24,描述了該軟體包algorithmic環境(用於排版演算法)和algorithm浮動包裝器(參見 下面),它旨在圍繞 algorithmic 環境進行包裝。
該algorithmic包被建議用於 IEEE 期刊,因為它是其預設樣式表的組成部分。 [1]
如何將 require/ensure 重新命名為 input/output
\floatname{algorithm}{Procedure}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
該algorithm2e包(首次釋出於 1995 年,根據 v5.2 手冊,最新更新於 2017 年 7 月)允許排版具有大量自定義功能的演算法。就像algorithmic一樣,該軟體包也不相容 Revtex-4.1。 [2]
與algorithmic, algorithm2e不同,它為演算法提供了大量自定義選項,以滿足各種使用者的需求。 CTAN 手冊 提供了清晰的示例列表和完整的控制集。
通常,\begin{algorithm}和\end{algorithm}之間的使用方式如下
1. 宣告一組關鍵字(以函式/運算子的形式排版)、佈局控制、標題、標題、頁首文字(出現在演算法的主要步驟之前,例如:輸入、輸出)
2. 編寫演算法的主要步驟,每一步都以 \ 結束;
這可以類比於在開始實際文件之前編寫 latex 前言。
該軟體包的載入方式如下
\usepackage[]{algorithm2e}
一個簡單的示例,摘自 v4.01 手冊,如下所示
\begin{algorithm}[H]
\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 section\;
current section becomes this one\;
}{
go back to the beginning of current section\;
}
}
\caption{How to write algorithms}
\end{algorithm}
這將生成
更多詳細資訊在 ctan 網站 上託管的手冊中。
該algorithmicx軟體包提供了許多流行的演算法設計結構。將\usepackage{algpseudocode}放入前言中,以使用 algorithmic 環境編寫演算法虛擬碼(\begin{algorithmic}...\end{algorithmic})。您可能希望使用 algorithm 環境(\usepackage{algorithm})將您的 algorithmic 程式碼包裝到 algorithm 環境中(\begin{algorithm}...\end{algorithm}),以生成具有編號演算法的浮動環境。
命令\begin{algorithmic}可以接受一個正整數的可選引數,如果提供該引數,將導致在該整數的倍數處進行行編號。例如\begin{algorithmic}[5]將進入 algorithmic 環境併為每五行編號。
下面是使用algorithmicx軟體包排版基本演算法的示例(請記住將\usepackage{algpseudocode}語句新增到您的文件前言中)
\begin{algorithmic}
\If {$i\geq maxval$}
\State $i\gets 0$
\Else
\If {$i+k\leq maxval$}
\State $i\gets i+k$
\EndIf
\EndIf
\end{algorithmic}
可以將 LaTeX 原始碼寫入程式設計師熟悉的格式,以便於閱讀。但是,這不會影響文件中的最終佈局。
基本命令具有以下語法
語句(\State 導致換行,也可以用在其他命令之前)
\State $x\gets <value>$
三種形式的 if 語句
\If{<condition>} <text> \EndIf
\If{<condition>} <text> \Else <text> \EndIf
\If{<condition>} <text> \ElsIf{<condition>} <text> \Else <text> \EndIf
第三種形式接受任意多個\ElsIf{}子句,根據需要。請注意,它是\ElsIf而不是\ElseIf.
迴圈
\For{<condition>} <text> \EndFor
\ForAll{<condition>} <text> \EndFor
\While{<condition>} <text> \EndWhile
\Repeat <text> \Until{<condition>}
\Loop <text> \EndLoop
先決條件和後置條件
\Require <text>
\Ensure <text>
函式
\Function{<name>}{<params>} <body> \EndFunction
\Return <text>
\Call{<name>}{<params>}
該命令通常與\State命令一起使用,如下所示
\Function{Increment}{$a$}
\State $a \gets a+1$
\State \Return $a$
\EndFunction
註釋
\Comment{<text>}
注意從舊版algorithmic軟體包切換的使用者:註釋可以放置在原始碼中的任何位置;與舊版algorithmic軟體包不同,沒有限制。
該algorithmicx軟體包允許您定義自己的環境。
若要定義以開始命令開頭並以結束命令結尾的塊,請使用
\algblock[<block>]{<start>}{<end>}
這將定義兩個命令\<start>和\<end>它們沒有引數。它們顯示的文字是\textbf{<start>}和\textbf{<end>}.
使用\algblockdefx您可以指定開始和結束命令輸出的文字以及這些命令的引數數量。在文字中,第 n 個引數由#n.
\algblockdefx[<block>]{<start>}{<end>}
[<startparamcount>][<default value>]{<start text>}
[<endparamcount>][<default value>]{<end text>}
示例
\algblock[Name]{Start}{End}
\algblockdefx[NAME]{START}{END}%
[2][Unknown]{Start #1(#2)}%
{Ending}
\algblockdefx[NAME]{}{OTHEREND}%
[1]{Until (#1)}
\begin{algorithmic}
\Start
\Start
\START[One]{x}
\END
\START{0}
\OTHEREND{\texttt{True}}
\End
\Start
\End
\End
\end{algorithmic}
更多高階自定義和其它結構在algorithmicx手冊中介紹:http://mirror.ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf
該program軟體包提供了排版演算法的宏。每行都設定為數學模式,因此所有縮排和間距都由程式自動完成。符號|variable_name|可以在普通文字、數學表示式或程式中使用,以指示變數名稱。使用\origbar在程式中獲取普通的|符號。命令\A, \B, \P, \Q, \R, \S, \T和\Z將相應的粗體字母與下一個物件作為下標一起排版(例如\S1排版為{\bf S$_1$}等等)。撇號正常工作,例如\S‘‘.
下面是使用program軟體包排版基本演算法的示例(請記住將\usepackage{program}語句新增到您的文件前言中)
\begin{program}
\mbox{A fast exponentiation procedure:}
\BEGIN \\ %
\FOR i:=1 \TO 10 \STEP 1 \DO
|expt|(2,i); \\ |newline|() \OD %
\rcomment{This text will be set flush to the right margin}
\WHERE
\PROC |expt|(x,n) \BODY
z:=1;
\DO \IF n=0 \THEN \EXIT \FI;
\DO \IF |odd|(n) \THEN \EXIT \FI;
\COMMENT{This is a comment statement};
n:=n/2; x:=x*x \OD;
\{ n>0 \};
n:=n-1; z:=z*x \OD;
|print|(z) \ENDPROC
\END
\end{program}
這些命令\(和\)被重新定義為在 minipage 中排版演算法,因此演算法可以作為公式中的單個框出現。例如,要說明某個特定動作系統等效於 WHILE 迴圈,您可以編寫
\[
\( \ACTIONS A:
A \EQ \IF \B{} \THEN \S{}; \CALL A
\ELSE \CALL Z \FI \QE
\ENDACTIONS \)
\EQT
\( \WHILE \B{} \DO \S{} \OD \)
\]
Dijkstra 條件和迴圈
\begin{program}
\IF x = 1 \AR y:=y+1
\BAR x = 2 \AR y:=y^2
\utdots
\BAR x = n \AR y:=\displaystyle\sum_{i=1}^n y_i \FI
\DO 2 \origbar x \AND x>0 \AR x:= x/2
\BAR \NOT 2 \origbar x \AR x:= \modbar{x+3} \OD
\end{program}
具有多個出口的迴圈
\begin{program}
\DO \DO \IF \B1 \THEN \EXIT \FI;
\S1;
\IF \B2 \THEN \EXIT(2) \FI \OD;
\IF \B1 \THEN \EXIT \FI \OD
\end{program}
一個逆向工程示例。
這是原始程式
\begin{program}
\VAR \seq{m := 0, p := 0, |last| := `` ''};
\ACTIONS |prog|:
|prog| \ACTIONEQ %
\seq{|line| := `` '', m := 0, i := 1};
\CALL |inhere| \ENDACTION
l \ACTIONEQ %
i := i+1;
\IF (i=(n+1)) \THEN \CALL |alldone| \FI ;
m := 1;
\IF |item|[i] \neq |last|
\THEN |write|(|line|); |line| := `` ''; m := 0;
\CALL |inhere| \FI ;
\CALL |more| \ENDACTION
|inhere| \ACTIONEQ %
p := |number|[i]; |line| := |item|[i];
|line| := |line| \concat `` '' \concat p;
\CALL |more| \ENDACTION
|more| \ACTIONEQ %
\IF (m=1) \THEN p := |number|[i];
|line| := |line| \concat ``, '' \concat p \FI ;
|last| := |item|[i];
\CALL l \ENDACTION
|alldone| \ACTIONEQ |write|(|line|); \CALL Z \ENDACTION \ENDACTIONS \END
\end{program}
這是轉換後的修正版本
\begin{program}
\seq{|line| := `` '', i := 1};
\WHILE i \neq n+1 \DO
|line| := |item|[i] \concat `` '' \concat |number|[i];
i := i+1;
\WHILE i \neq n+1 \AND |item|[i] = |item|[i-1] \DO
|line| := |line| \concat ``, '' \concat |number|[i]);
i := i+1 \OD ;
|write|(|line|) \OD
\end{program}
該包還提供了一個宏來排版這樣的集合\set{x \in N | x > 0}.
可以透過設定\NumberProgramstrue來對行進行編號,並使用\NumberProgramsfalse
該algorithm包文件
環境對於由algorithmic生成的演算法被“浮動”到文件中的最佳位置以避免跨頁拆分通常很有用。該algorithm環境提供了此功能和其他一些有用功能。透過在文件的序言中新增
\usepackage{algorithm}來包含它。它被
\begin{algorithm}
\caption{<your caption for this algorithm>}
\label{<your label for references later in your document>}
\begin{algorithmic}
<algorithmic environment>
\end{algorithmic}
\end{algorithm}
演算法編號
環境輸入該algorithm包的預設編號系統是對演算法進行順序編號。這通常不可取,特別是在大型文件中,根據章節進行編號更合適。可以透過提供文件元件的名稱來影響演算法的編號,在該元件內應重新開始編號。此選項的合法值為:part、chapter、section、subsection、subsubsection 或 nothing(預設值)。例如
\usepackage[chapter]{algorithm}
演算法列表
環境當使用圖形或表格時,您可以在目錄附近新增它們的列表;該algorithm包提供了類似的命令。只需在文件中的任何位置放置
\listofalgorithms
,LaTeX 就會列印文件中“演算法”環境的列表,並附帶相應的頁面和標題。
來自手冊的示例
環境這是一個取自手冊的示例(官方手冊,第 14 頁)
\begin{algorithm} % enter the algorithm environment
\caption{Calculate $y = x^n$} % give the algorithm a caption
\label{alg1} % and a label for \ref{} commands later in the document
\begin{algorithmic} % enter the algorithmic environment
\REQUIRE $n \geq 0 \vee x \neq 0$
\ENSURE $y = x^n$
\STATE $y \Leftarrow 1$
\IF{$n < 0$}
\STATE $X \Leftarrow 1 / x$
\STATE $N \Leftarrow -n$
\ELSE
\STATE $X \Leftarrow x$
\STATE $N \Leftarrow n$
\ENDIF
\WHILE{$N \neq 0$}
\IF{$N$ is even}
\STATE $X \Leftarrow X \times X$
\STATE $N \Leftarrow N / 2$
\ELSE[$N$ is odd]
\STATE $y \Leftarrow y \times X$
\STATE $N \Leftarrow N - 1$
\ENDIF
\ENDWHILE
\end{algorithmic}
\end{algorithm}
參考文獻
環境- 該演算法包的官方手冊,Rogério Brito(2009),http://mirrors.ctan.org/macros/latex/contrib/algorithms/algorithms.pdf


