So formatieren Sie Zeilen im Algorithmus

So formatieren Sie Zeilen im Algorithmus

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 \ANDder Zustand wird nicht erkannt If.

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).

Bildbeschreibung hier eingeben

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 flowfür \OR.

Die cls-Datei finden Sie unter diesem Link

Antwort1

Das Problem liegt an der geringen Größe der Säule.

Sie haben zwei Möglichkeiten.

  1. Erklären \footnotesizeSie 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}
    

    Bildbeschreibung hier eingeben

  2. Verwenden Sie algorithm*anstelle von algorithm, 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*}
    

Bildbeschreibung hier eingeben

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.

  1. Sie können den Namen der Prozedur beliebig formatieren, indem Sie das \textprocMakro neu definieren, zB:

    \algrenewcommand\textproc{\textit}
    

    Wenn Ihnen die von mir gewählte Kursivschrift nicht gefällt, versuchen Sie es \textrmstattdessen mit dieser.

  2. Wenn Sie egregs Vorschlag nicht verwenden möchten und bei Ihrer Schriftgröße und einem einspaltigen Algorithmus bleiben möchten, können Sie \raggedrightdirekt 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.

  3. Die von Ihnen erwähnten logischen Konnektoren werden nicht von unterstützt algorithmicx(sondern von algorithmics, 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 \Returnstattdessen \State returndas 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}$.

Bildbeschreibung hier eingeben

verwandte Informationen