跳轉到內容

LaTeX/演算法

來自華夏公益教科書
(從 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. 純 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等價物類似,但大小寫不同。該軟體包algorithms bundlectan 儲存庫 中,日期為 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包進行排版

[編輯 | 編輯原始碼]

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}放入前言中,以使用 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包進行排版

[編輯 | 編輯原始碼]

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}


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


參考文獻

環境
  1. [1]
  2. http://tex.stackexchange.com/questions/70181/revtex4-1-and-algorithm2e-indentation-clash


Clipboard

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

答案:只需截圖並裁剪



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