Я использую шаблон 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.
решение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}
Используйте
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 путем уменьшения размера шрифта или расширения текста и, таким образом, избегания переносов строк.
Вы можете отформатировать имя процедуры любым удобным для вас способом, переопределив макрос
\textproc
, например:\algrenewcommand\textproc{\textit}
Если вам не нравится выбранный мной курсив, попробуйте
\textrm
другой.Если вы не хотите использовать предложение egreg и хотите придерживаться своего размера шрифта и алгоритма с одним столбцом, вы можете добавить
\raggedright
прямо перед вашим\begin{algorithmic}
, чтобы избежать выравнивания по правому краю в вашем алгоритме. Однако это приведет к переносу строк без отступа, что будет выглядеть некрасиво. Вы можете явно разбить строки, используя\\
. Я рекомендую предложение egreg.Логические связки, которые вы упомянули, не поддерживаются
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}$
.