アルゴリズムの行をフォーマットする方法

アルゴリズムの行をフォーマットする方法

私は論文を書くために ACM カンファレンス論文テンプレート (2 列) を使用しています。アルゴリズムの形式に関する問題が長い間私を悩ませてきました。

  • 関数名は常に大文字に変換されます。
  • 単語間の空白が大きい
  • \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 条件内に大きな空白があります。これらの空白は自動的に挿入されたようで、削除できませんでした。

また、条件テストで add/or/not ロジックを使用するにはどうすればよいでしょうか。ご覧のとおり、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

問題は列のサイズが狭いことに起因します。

選択肢は2つあります。

  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、アルゴリズムがページの上部に 2 列幅でタイプセットされます。

    \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 の提案を使用せず、フォント サイズと 1 列のアルゴリズムに固執したい場合は、\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$非常に見苦しく見えます (添付の図の 2 行目の のタイプセットを見てください$TN$--- 数式モードでの文字の並置は乗算を意味し、文字間に余分なスペースが残ります)。数式モードを削除するか、 を使用してください$\mathit{mh0}.\mathit{TN}$

ここに画像の説明を入力してください

関連情報