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\AND
não é reconhecido pelaIf
condiçã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).
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 flow
para \OR.
Responder1
O problema é devido ao tamanho estreito da coluna.
Você tem duas opções.
Declare
\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}
Use
algorithm*
em vez dealgorithm
, 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*}
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.
Você pode formatar o nome do procedimento da maneira que desejar, redefinindo a
\textproc
macro, por exemplo:\algrenewcommand\textproc{\textit}
Se você não gosta do itálico que escolhi, tente
\textrm
.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
\raggedright
logo 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.Os conectivos lógicos mencionados não são suportados por
algorithmicx
(mas poralgorithmics
, 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 \Return
em vez de\State return
ter 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}$
.