我使用 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 的回答,通过减小字体大小或加宽文本从而避免换行来修复“错误”#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}$
。