Как отформатировать строку в алгоритме

Как отформатировать строку в алгоритме

Я использую шаблон ACM conference paper (Две колонки) для написания статьи. Проблемы с форматом Algorithms меня долго беспокоят:

  • Имя функции всегда преобразуется в ВЕРХНИЙ РЕГИСТР.
  • Увеличенный пробел между словами
  • \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 есть большой пробел. Мне не удалось удалить эти пробелы, так как, похоже, они вставляются автоматически.

Также, как я могу использовать логику add/or/not в проверке условия. Как вы можете видеть, условие в строке 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

Я продолжаю ответ egreg, который исправляет «ошибку» №2 путем уменьшения размера шрифта или расширения текста и, таким образом, избегания переносов строк.

  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}
    

    и что вы используете \State \Returnвместо , \State returnчтобы выделить ключевое слово «return» также жирным шрифтом.

Наконец, позвольте мне предложить вам либо использовать математический режим последовательно в вашем алгоритме, либо избегать его вообще. Например, $mh0.TN$выглядит очень некрасиво (посмотрите, как $TN$набрано в строке 2 прилагаемого рисунка --- сопоставление букв в математическом режиме подразумевает умножение, и это оставляет лишнее пространство между буквами). Либо удалите математический режим, либо используйте $\mathit{mh0}.\mathit{TN}$.

введите описание изображения здесь

Связанный контент