如何在算法中格式化行

如何在算法中格式化行

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

在此处输入图片描述

相关内容