如何格式化演算法中的行

如何格式化演算法中的行

我使用ACM會議論文範本(兩欄)來寫論文。關於演算法格式的問題困擾了我很久:

  • 函數名始終轉換為大寫。
  • 詞與詞之間的空白較大
  • \OR,或\AND無法辨識If條件。

範例如下:

\documentclass[10pt, preprint]{sigplanconf}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{listings}
%\usepackage[chapter]{algorithm}
\usepackage{algorithm}% http://ctan.org/pkg/algorithms
%\usepackage{algorithmic}
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{url}
\usepackage{booktabs}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{color}
\usepackage{courier}
\usepackage{lipsum}

\begin{document}

\special{papersize=8.5in,11in}
\setlength{\pdfpageheight}{\paperheight}
\setlength{\pdfpagewidth}{\paperwidth}

\conferenceinfo{CONF 'yy}{Month d--d, 20yy, City, ST, Country} 
\copyrightyear{20yy} 
\copyrightdata{978-1-nnnn-nnnn-n/yy/mm} 
\doi{nnnnnnn.nnnnnnn}

\preprintfooter{short description of paper}   % 'preprint' option specified.

\title{AAA}
 \authorinfo{}
            {}
\maketitle
\begin{abstract}
AAA
\end{abstract}

\section{Introduction}


This is test for  Algorithm~\ref{alg:equivalentmap}. Hello world..

\begin{algorithm}
\caption{Equivalent Method Handle (MH) Detection}
\label{alg:equivalentmap}
\begin{algorithmic}[1]
\State $mh$: A method handle to be proceeded.
\State $TN$: Transformation Name.

\Procedure{Detection}{$a$, $b$}
    \If{eqMap.containsKey($a$.TN) or countMH($a$)!=countMH($b$)}
      \State return false
    \EndIf

    \If{$a$.isDirectMH() and $b$.isDirect()}
       \State return $a$.targetMethod().equal($b$.targetMethod())
    \EndIf

    \ForAll{method handle $mh0$ in $mh$ graph}
              \If {$equivMap$ contains $mh0.TN$} 
                   \ForAll {$equivSet$ in the $equivMap$.get($mh0.TN$)}
                      \If{precheck($mh0$, $equivSet$) is false}  
                          \State   continue
                      \EndIf

                      \If{ $mh0$ is equivalent to a MH in $equivSet$}
                           \State  add $mh0$ to this $equivSet$
                           \State  break;                   
                      \EndIf
                  \EndFor
                  \If{none of equivalent set is matched}
                      \State initialize new $equivSet$ with $mh0$.
                      \State append this new set to $equivMap$.get($mh0.TN$) list. 
                  \EndIf
             \Else
                  \State  initialize new equivalent set \emph{equivSet} with $mh0$
                  \State  add new pair ($mh0.TN$, \emph{equivSet}) to $equivMap$. 
             \EndIf
   \EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}


\end{document}

如下圖所示,第 3 行中的函數名稱會自動轉換為大寫(我不希望進行此修改)。

在此輸入影像描述

在第 4 行(12 和 23)中,IF 條件內部有一個大空白。我未能刪除這些空白,因為它似乎是自動插入的。

另外,我如何在條件測試中使用新增/或/不邏輯。正如您所看到的,第 4 行中的條件是由 OR 和 AND 等邏輯組成的。我嘗試更換第4行:

``\If{eqMap.containsKey($a$.TN) or countMH($a$)!=countMH($b$)}''

``\If{eqMap.containsKey($a$.TN) \OR countMH($a$)!=countMH($b$)}''

但失敗了。編譯器表示undefined control flow為 \OR。

此連結中提供了 cls 文件

答案1

此問題是由於色譜柱尺寸狹窄造成的。

你有兩個選擇。

  1. \footnotesize之前聲明\begin{algoritmic}

    \begin{algorithm}
    \caption{Equivalent Method Handle (MH) Detection}
    \label{alg:equivalentmap}
    \footnotesize
    \begin{algorithmic}[1]
    \State $mh$: A method handle to be proceeded.
    ...
    \EndProcedure
    \end{algorithmic}
    \end{algorithm}
    

    在此輸入影像描述

  2. 使用algorithm*而不是algorithm,它將在頁面頂部以雙列寬度排版演算法。

    \begin{algorithm*}
    \caption{Equivalent Method Handle (MH) Detection}
    \label{alg:equivalentmap}
    \begin{algorithmic}[1]
    \State $mh$: A method handle to be proceeded.
    ...
    \EndProcedure
    \end{algorithmic}
    \end{algorithm*}
    

在此輸入影像描述

答案2

我繼續egreg的回答,它透過減小字體大小或加寬文字來修復「bug」#2,從而避免換行。

  1. 您可以透過重新定義巨集來以您喜歡的任何方式格式化流程的名稱\textproc,例如:

    \algrenewcommand\textproc{\textit}
    

    如果您不喜歡我選擇的斜體,請嘗試\textrm改為。

  2. 如果您不想使用egreg的建議並且想堅持使用字體大小和單列演算法,您可以\raggedright在 , 之前添加\begin{algorithmic},以避免演算法中的右對齊。然而,這會導致換行不縮排並且看起來很難看。您可以使用 明確地換行\\。不過,我推薦egreg的建議。

  3. 您提到的邏輯連接詞不受支援algorithmicx(但受algorithmics,與您的來源不相容)支援。您可以使用以下方式定義它們:

    \usepackage{xspace}
    \algnewcommand\OR{\textbf{or}\xspace}
    \algnewcommand\AND{\textbf{and}\xspace}
    \algnewcommand\NOT{\textbf{not}\xspace}
    

    我還建議您對“break”和“continue”執行相同的操作,因此它們以粗體顯示:

    \algnewcommand\Break{\textbf{break}\xspace}
    \algnewcommand\Continue{\textbf{continue}\xspace}
    

    並且您使用\State \Return而不是\State return讓“return”關鍵字也以粗體顯示。

最後,我建議您要么在演算法中一致使用數學模式,要么完全避免使用它。例如,$mh0.TN$看起來很醜(看看$TN$附圖第2行是怎麼排版的-數學模式下字母並列的意思是乘法,這樣字母之間就留了額外的空間)。刪除數學模式,或使用$\mathit{mh0}.\mathit{TN}$.

在此輸入影像描述

相關內容