Ich verwende die ACM-Konferenzpapiervorlage (zweispaltig), um Papiere zu schreiben. Die Probleme mit dem Algorithmenformat nerven mich schon lange:
- Der Funktionsname wird immer in GROSSBUCHSTABEN umgewandelt.
- Größere Leerzeichen zwischen Wörtern
\OR
, oder\AND
der Zustand wird nicht erkanntIf
.
Nachfolgend sehen Sie ein Beispiel:
\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}
Wie im Screenshot unten gezeigt, wird der Funktionsname in Zeile 3 automatisch in Großbuchstaben umgewandelt (ich möchte diese Änderung nicht).
In Zeile 4 (12 und 23) befindet sich innerhalb der IF-Bedingung ein großes Leerzeichen. Ich habe es nicht geschafft, dieses Leerzeichen zu entfernen, da es so aussieht, als ob es automatisch eingefügt wird.
Außerdem: Wie kann ich Add/Oder/Nicht-Logiken im Bedingungstest verwenden? Wie Sie sehen, ist die Bedingung in Zeile 4 eine Zusammensetzung aus einer Logik, die ODER und UND ist. Ich habe versucht, Zeile 4 zu ersetzen:
``\If{eqMap.containsKey($a$.TN) or countMH($a$)!=countMH($b$)}''
mit
``\If{eqMap.containsKey($a$.TN) \OR countMH($a$)!=countMH($b$)}''
aber fehlgeschlagen. Der Compiler sagt undefined control flow
für \OR.
Antwort1
Das Problem liegt an der geringen Größe der Säule.
Sie haben zwei Möglichkeiten.
Erklären
\footnotesize
Sie vor\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}
Verwenden Sie
algorithm*
anstelle vonalgorithm
, wodurch der Algorithmus in doppelter Spaltenbreite oben auf der Seite gesetzt wird.\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*}
Antwort2
Ich führe die Antwort von egreg weiter, die den „Fehler“ Nr. 2 behebt, indem die Schriftgröße reduziert bzw. der Text verbreitert und so Zeilenumbrüche vermieden werden.
Sie können den Namen der Prozedur beliebig formatieren, indem Sie das
\textproc
Makro neu definieren, zB:\algrenewcommand\textproc{\textit}
Wenn Ihnen die von mir gewählte Kursivschrift nicht gefällt, versuchen Sie es
\textrm
stattdessen mit dieser.Wenn Sie egregs Vorschlag nicht verwenden möchten und bei Ihrer Schriftgröße und einem einspaltigen Algorithmus bleiben möchten, können Sie
\raggedright
direkt vor Ihrem hinzufügen\begin{algorithmic}
, um die rechtsbündige Ausrichtung in Ihrem Algorithmus zu vermeiden. Dies führt jedoch zu umbrochenen Zeilen, die nicht eingerückt sind und hässlich aussehen. Sie können die Zeilen explizit umbrechen, indem Sie verwenden\\
. Ich empfehle jedoch egregs Vorschlag.Die von Ihnen erwähnten logischen Konnektoren werden nicht von unterstützt
algorithmicx
(sondern vonalgorithmics
, das nicht mit Ihrer Quelle kompatibel ist). Sie können sie wie folgt definieren:\usepackage{xspace} \algnewcommand\OR{\textbf{or}\xspace} \algnewcommand\AND{\textbf{and}\xspace} \algnewcommand\NOT{\textbf{not}\xspace}
Ich schlage außerdem vor, dass Sie dasselbe für „break“ und „continu“ tun, damit diese fett gedruckt erscheinen:
\algnewcommand\Break{\textbf{break}\xspace} \algnewcommand\Continue{\textbf{continue}\xspace}
und dass Sie
\State \Return
stattdessen\State return
das Schlüsselwort „return“ auch fett gedruckt haben.
Abschließend möchte ich vorschlagen, dass Sie den Mathematikmodus in Ihrem Algorithmus entweder konsequent verwenden oder ihn ganz vermeiden. Beispielsweise $mh0.TN$
sieht sehr hässlich aus (sehen Sie sich an, wie $TN$
in Zeile 2 der beigefügten Abbildung gesetzt ist – die Nebeneinanderstellung der Buchstaben im Mathematikmodus ist als Multiplikation gedacht, und dies lässt zusätzlichen Platz zwischen den Buchstaben). Entfernen Sie entweder den Mathematikmodus oder verwenden Sie $\mathit{mh0}.\mathit{TN}$
.