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\AND
no se reconoce suIf
condició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).
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.
Respuesta1
El problema se debe al estrecho tamaño de la columna.
Tienes dos opciones.
declarar
\footnotesize
antes\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}
Úselo
algorithm*
en lugar dealgorithm
, 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*}
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.
Puede formatear el nombre del procedimiento de la forma que desee, redefiniendo la
\textproc
macro, por ejemplo:\algrenewcommand\textproc{\textit}
Si no te gustan las cursivas que elegí, inténtalo
\textrm
.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
\raggedright
justo 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.Los conectivos lógicos que mencionas no son compatibles con
algorithmicx
(sino conalgorithmics
, 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 \Return
en lugar de\State return
tener 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}$
.