跳轉到內容

LaTeX/演算法

來自華夏公益教科書

LaTeX

入門
  1. 介紹
  2. 安裝
  3. 安裝額外的軟體包
  4. 基礎
  5. 如何獲得幫助

常見元素

  1. 文件結構
  2. 文字格式
  3. 段落格式
  4. 顏色
  5. 字型
  6. 列表結構
  7. 特殊字元
  8. 國際化
  9. 旋轉
  10. 表格
  11. 標題建立
  12. 頁面佈局
  13. 自定義頁面頁首和頁尾‎
  14. 匯入圖形
  15. 浮動、圖形和標題
  16. 腳註和邊注
  17. 超連結
  18. 標籤和交叉引用
  19. 首字母

機制

  1. 錯誤和警告
  2. 長度
  3. 計數器
  4. 規則和撐

技術文字

  1. 數學
  2. 高階數學
  3. 定理
  4. 化學圖形
  5. 演算法
  6. 原始碼列表
  7. 語言學

特殊頁面

  1. 索引
  2. 術語表
  3. 參考文獻管理
  4. 更多參考文獻

特殊文件

  1. 科研報告(學士論文、碩士論文、博士論文)
  2. 信函
  3. 簡報
  4. 教師角
  5. 簡歷
  6. 學術期刊(MLA、APA 等)

建立圖形

  1. 介紹程式化圖形
  2. MetaPost
  3. 圖片
  4. PGF/TikZ
  5. PSTricks
  6. Xy-pic
  7. 建立 3D 圖形

程式設計

  1. Plain TeX
  2. 建立軟體包
  3. 建立軟體包文件
  4. 主題

其他

  1. 模組化文件
  2. 協作編寫 LaTeX 文件
  3. 匯出到其他格式

幫助和建議

  1. 常見問題解答
  2. 技巧和竅門

附錄

  1. 作者
  2. 連結
  3. 軟體包參考
  4. LaTeX 示例文件
  5. 索引
  6. 命令詞彙表

編輯此框編輯目錄


LaTeX 有多個用於將演算法排版成“虛擬碼”形式的軟體包。它們提供了比統一風格(即所有內容都使用打字機字型)更具樣式的增強功能,這樣迴圈或條件語句等結構在視覺上與其他文字區分開來。虛擬碼通常放在一個演算法環境中。對於排版用真實程式語言編寫的真實程式碼,請考慮 原始碼列表 中介紹的listings 軟體包。

有四個值得注意的軟體包:algorithmicalgorithm2ealgorithmicxprogram

使用algorithmic軟體包排版

[編輯 | 編輯原始碼]

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等效項相似,但大小寫不同。該軟體包演算法捆綁包位於 ctan 儲存庫 中,日期為 2009-08-24,描述了algorithmic環境(用於排版演算法)和algorithm浮動包裝器(見 下面),該包裝器旨在環繞演算法環境。

algorithmic軟體包建議用於 IEEE 期刊,因為它屬於它們預設樣式表的一部分。[1]

如何將 require/ensure 重新命名為 input/output

\floatname{algorithm}{Procedure}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}

使用algorithm2e軟體包排版

[編輯 | 編輯原始碼]

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軟體包排版

[編輯 | 編輯原始碼]

algorithmicx軟體包提供了一些流行的演算法設計結構。在你的前言中加入\usepackage{algpseudocode}以使用演算法環境編寫演算法虛擬碼(\begin{algorithmic}...\end{algorithmic})。你可能希望使用演算法環境(\usepackage{algorithm})將你的演算法程式碼包裝在演算法環境中(\begin{algorithm}...\end{algorithm})以生成具有編號演算法的浮動環境。

命令\begin{algorithmic}可以給出可選引數為一個正整數,如果給出,則會使行號在該整數的倍數處出現。例如\begin{algorithmic}[5]將進入演算法環境,並對每五行進行編號。

以下是用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軟體包排版

[編輯 | 編輯原始碼]

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}

命令\(\)被重新定義為在迷你頁面中排版演算法,因此演算法可以作為公式中的單個框出現。例如,要說明特定動作系統等效於 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環境

[edit | edit source]

對於由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}

演算法編號

[edit | edit source]

algorithm包的預設編號系統是按順序對演算法進行編號。這通常不可取,尤其是在大型文件中,根據章節進行編號更為合適。可以透過提供應重新開始編號的文件元件的名稱來影響演算法的編號。此選項的合法值為:part、chapter、section、subsection、subsubsection 或無(預設)。例如

\usepackage[chapter]{algorithm}

演算法列表

[edit | edit source]

當您使用圖形或表格時,您可以在目錄附近新增它們的列表;該algorithm包提供了一個類似的命令。只需在文件中的任何位置放置

\listofalgorithms

,LaTeX 就會列印文件中所有“algorithm”環境的列表,以及相應的頁碼和標題。

來自手冊的示例

[edit | edit source]

這是一個來自手冊的示例 (官方手冊,第 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}


官方手冊位於
http://mirrors.ctan.org/macros/latex/contrib/algorithms/algorithms.pdf


參考文獻

[edit | edit source]
  1. [1]
  2. http://tex.stackexchange.com/questions/70181/revtex4-1-and-algorithm2e-indentation-clash


Clipboard

待辦事項
寫更多內容並新增一些示例程式碼的圖片;如何生成 png 檔案?

回答:只需截圖並裁剪



前一節:化學圖形 索引 下一節:原始碼列表
華夏公益教科書