Cómo formatear línea en algoritmo

Cómo formatear línea en algoritmo

Utilizo la plantilla de documento de conferencia ACM (dos columnas) para escribir el documento. Los problemas me molestan desde hace mucho tiempo con el formato de los algoritmos:

  • El nombre de la función siempre se convierte a MAYÚSCULAS.
  • Espacio en blanco más grande entre palabras
  • \OR, o \ANDno se reconoce su Ifcondición.

A continuación se muestra un ejemplo:

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

Como se muestra en la captura de pantalla a continuación, el nombre de la función en la línea 3 se convierte a mayúsculas automáticamente (no quiero esta modificación).

ingrese la descripción de la imagen aquí

En la línea 4 (12 y 23), hay un gran espacio en blanco dentro de la condición IF. No pude eliminar estos espacios en blanco porque parece que se insertan automáticamente.

Además, ¿cómo puedo utilizar lógicas de agregar/o/no en la prueba de condición? Como puede ver, la condición en la línea 4 es la composición de alguna lógica que es O y Y. Intenté reemplazar la línea 4:

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

con

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

pero falló. El compilador dice undefined control flow\OR.

El archivo cls se proporciona en este enlace.

Respuesta1

El problema se debe al estrecho tamaño de la columna.

Tienes dos opciones.

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

    ingrese la descripción de la imagen aquí

  2. Úselo algorithm*en lugar de algorithm, lo que escribirá el algoritmo en doble columna en la parte superior de la 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*}
    

ingrese la descripción de la imagen aquí

Respuesta2

Continúo con la respuesta de egreg, que corrige el "error" n.° 2 al reducir el tamaño de fuente o ampliar el texto y evitar así los saltos de línea.

  1. Puede formatear el nombre del procedimiento de la forma que desee, redefiniendo la \textprocmacro, por ejemplo:

    \algrenewcommand\textproc{\textit}
    

    Si no te gustan las cursivas que elegí, inténtalo \textrm.

  2. Si no desea utilizar la sugerencia de egreg y desea ceñirse al tamaño de fuente y un algoritmo de una sola columna, puede agregar \raggedrightjusto antes de su \begin{algorithmic}, para evitar una justificación correcta en su algoritmo. Sin embargo, esto dará como resultado líneas envueltas que no tienen sangría y se ven feas. Puede dividir las líneas explícitamente usando \\. Sin embargo, recomiendo la sugerencia de egreg.

  3. Los conectivos lógicos que mencionas no son compatibles con algorithmicx(sino con algorithmics, que no es compatible con tu fuente). Puedes definirlos con:

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

    Permítame sugerirle también que haga lo mismo con "pausa" y "continuar", para que aparezcan en negrita:

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

    y que utilices \State \Returnen lugar de \State returntener la palabra clave "return" también en negrita.

Finalmente, permítame sugerirle que utilice el modo matemático de manera consistente en su algoritmo o lo evite por completo. Por ejemplo, $mh0.TN$se ve muy feo (mira cómo $TN$está escrito en la línea 2 de la figura adjunta: la yuxtaposición de letras en el modo matemático se entiende como multiplicación, y esto deja espacio extra entre las letras). Elimine el modo matemático o utilice $\mathit{mh0}.\mathit{TN}$.

ingrese la descripción de la imagen aquí

información relacionada