알고리즘에서 라인 형식을 지정하는 방법

알고리즘에서 라인 형식을 지정하는 방법

저는 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 조건 내부에 큰 공백이 있습니다. 이 공백은 자동으로 삽입되는 것 같아서 제거하지 못했습니다.

또한 조건 테스트에서 추가/또는/하지 않음 논리를 어떻게 사용할 수 있습니까? 보시다시피 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

나는 글꼴 크기를 줄이거 나 텍스트를 넓혀 줄 바꿈을 피함으로써 "버그"# 2를 수정하는 egreg의 답변을 계속하고 있습니다.

  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}
    

    "return" 키워드도 굵게 표시하는 \State \Return대신 사용합니다 .\State return

마지막으로, 알고리즘에서 수학 모드를 일관되게 사용하거나 완전히 사용하지 않는 것이 좋습니다. 예를 들어, $mh0.TN$매우 보기 흉해 보입니다( $TN$첨부된 그림의 2번째 줄에 어떻게 조판되어 있는지 보세요 --- 수학 모드에서 문자를 병치하는 것은 곱셈을 의미하므로 문자 사이에 여분의 공간이 남습니다). 수학 모드를 제거하거나 $\mathit{mh0}.\mathit{TN}$.

여기에 이미지 설명을 입력하세요

관련 정보