我使用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。
答案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}
使用
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,從而避免換行。
您可以透過重新定義巨集來以您喜歡的任何方式格式化流程的名稱
\textproc
,例如:\algrenewcommand\textproc{\textit}
如果您不喜歡我選擇的斜體,請嘗試
\textrm
改為。如果您不想使用egreg的建議並且想堅持使用字體大小和單列演算法,您可以
\raggedright
在 , 之前添加\begin{algorithmic}
,以避免演算法中的右對齊。然而,這會導致換行不縮排並且看起來很難看。您可以使用 明確地換行\\
。不過,我推薦egreg的建議。您提到的邏輯連接詞不受支援
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}$
.