Como formatar linha no algoritmo

Como formatar linha no algoritmo

Eu uso o modelo de documento de conferência ACM (duas colunas) para escrever o artigo. Os problemas me incomodam há muito tempo sobre o formato dos algoritmos:

  • O nome da função sempre é convertido em MAIÚSCULAS.
  • Espaço em branco maior entre palavras
  • \OR, ou \ANDnão é reconhecido pela Ifcondição.

Um exemplo está abaixo:

\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}

Conforme mostrado na imagem abaixo, o nome da função na linha 3 é convertido para maiúscula automaticamente (não quero essa modificação).

insira a descrição da imagem aqui

Na linha 4 (12 e 23), há um grande espaço em branco dentro da condição IF. Não consegui remover esses espaços em branco, pois parece que eles foram inseridos automaticamente.

Além disso, como posso usar lógicas add/or/not no teste de condição. Como você pode ver, a condição na linha 4 é a composição de alguma lógica que é OR e AND. Tentei substituir a linha 4:

``\If{eqMap.containsKey($a$.TN) or countMH($a$)!=countMH($b$)}''

com

``\If{eqMap.containsKey($a$.TN) \OR countMH($a$)!=countMH($b$)}''

mas falhou. O compilador diz undefined control flowpara \OR.

O arquivo cls é fornecido neste link

Responder1

O problema é devido ao tamanho estreito da coluna.

Você tem duas opções.

  1. Declare \footnotesizeantes\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}
    

    insira a descrição da imagem aqui

  2. Use algorithm*em vez de algorithm, que irá compor o algoritmo em largura de coluna dupla no topo de uma página.

    \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*}
    

insira a descrição da imagem aqui

Responder2

Continuo a resposta do egreg, que corrige o "bug" nº 2, reduzindo o tamanho da fonte ou ampliando o texto e evitando quebras de linha.

  1. Você pode formatar o nome do procedimento da maneira que desejar, redefinindo a \textprocmacro, por exemplo:

    \algrenewcommand\textproc{\textit}
    

    Se você não gosta do itálico que escolhi, tente \textrm.

  2. Se você não quiser usar a sugestão do egreg e quiser manter o tamanho da fonte e um algoritmo de coluna única, poderá adicionar \raggedrightlogo antes do seu \begin{algorithmic}, para evitar a justificativa correta no seu algoritmo. Isso, no entanto, resultará em linhas quebradas que não serão recuadas e parecerão feias. Você pode quebrar as linhas explicitamente usando \\. Eu recomendo a sugestão de egreg, no entanto.

  3. Os conectivos lógicos mencionados não são suportados por algorithmicx(mas por algorithmics, que não é compatível com sua fonte). Você pode defini-los com:

    \usepackage{xspace}
    \algnewcommand\OR{\textbf{or}\xspace}
    \algnewcommand\AND{\textbf{and}\xspace}
    \algnewcommand\NOT{\textbf{not}\xspace}
    

    Deixe-me sugerir também que você faça o mesmo para "interromper" e "continuar", para que apareçam em negrito:

    \algnewcommand\Break{\textbf{break}\xspace}
    \algnewcommand\Continue{\textbf{continue}\xspace}
    

    e que você usa \State \Returnem vez de \State returnter a palavra-chave "return" também em negrito.

Finalmente, deixe-me sugerir que você use o modo matemático de forma consistente em seu algoritmo ou evite-o completamente. Por exemplo, $mh0.TN$parece muito feio (veja como $TN$está escrito na linha 2 da figura anexa --- a justaposição de letras no modo matemático significa multiplicação, e isso deixa espaço extra entre as letras). Remova o modo matemático ou use $\mathit{mh0}.\mathit{TN}$.

insira a descrição da imagem aqui

informação relacionada