Ich versuche, mit dem Paket einen Algorithmus zu schreiben algorithm2e
.
Dies ist mein Code:
\usepackage[linesnumbered,ruled]{algorithm2e}
...
{\footnotesize
\IncMargin{1em}
\begin{algorithm}[H]
\SetAlgoVlined
\SetAlgoNlRelativeSize{-1}
\SetNlSkip{1em}
$ALIGNMENTS \gets NEXT$\;
\BlankLine
\While{$(C_{cov} > 0) \wedge (|ALIGNMENTS| > 0)$}{
$NEXT \gets 0$\;
\ForEach{$A \in ALIGNMENTS$}{
$U \gets checkAlignments(\mu,A,C_{cov})$\;
\uIf{$|U| = 1$}{
$\mu \gets updateProfile(\mu,U)$\;
}
\Else{
$NEXT = NEXT \cup \{A\}$\;
}
}
\If{$|ALIGNMENTS| = |NEXT|$}{
$C_{cov} \gets C_{cov} - 1$\;
}
$ALIGNMENTS \gets NEXT$\;
}
\BlankLine
\KwRet{$\mu$}\;
\end{algorithm}
}
Das Problem besteht darin, dass die Zeilennummern nicht richtig ausgerichtet sind: Beispielsweise steht die 9 viel weiter rechts als die 1.
Wie kann ich sie also richtig horizontal ausrichten?
Antwort1
Dies war ziemlich schwer zu debuggen. Auf den ersten Blick scheint die Fehlausrichtung willkürlich, aber bei genauerem Hinsehen verschieben sich die Zahlen umso weiter nach rechts, je mehr vertikale Regeln auf dieser Linie angewendet werden. Am besten sieht man dies, wenn man sich die Paare 6/8 und 7/9 ansieht:
Es stellt sich heraus, dass der zusätzliche Abstand tatsächlich (die Anzahl der vertikalen Linien in dieser Zeile) x0,4pt beträgt, was die Standardbreite für Linien in LaTeX ist. Daher ist die Auswirkung dieses Fehlers bei Standardschriftgrößen und langen Blöcken fast nicht wahrnehmbar.
Bei genauerem Hinsehen stellt man fest, dass die vertikalen Regeln durch die Verschachtelung mehrerer „e“ und „s“ ineinander algortihm2e
erstellt werden , wobei jedem äußeren „e“ ein „s“ vorangestellt ist , das die vertikale Regel für jeden Algorithmusblock zeichnet.\hbox
\vtop
\vtop
\vrule
(NB: Wenn das Paket die Einrückung von Blöcken berechnet, scheint dieser zusätzliche Abstand berücksichtigt zu werden. Er fehlt jedoch, wenn \llap
am Anfang des folgenden Codes ein Feld eingefügt wird, um die Zeilennummer um einen kumulierten Abstand nach links zu verschieben. Ich bin mir nicht sicher, warum es für diesen Abstand zwei verschiedene Dimensionsregister gibt.)
Eine einfache Lösung für diesen Fehler besteht darin, die Breite jeder vertikalen Linie rückgängig zu machen, indem man \kern-0.4pt
dahinter eins einfügt. Sie können diesen Patch ganz einfach mithilfe des \patchcmd
aus dem etoolbox
Paket anwenden. Fügen Sie einfach den folgenden Code zu Ihrer Präambel hinzu:
\usepackage{etoolbox}
\makeatletter
\patchcmd\algocf@Vline{\vrule}{\vrule \kern-0.4pt}{}{}
\patchcmd\algocf@Vsline{\vrule}{\vrule \kern-0.4pt}{}{}
\makeatother
Die neue Ausgabe liefert korrekt ausgerichtete Zeilennummern:
Antwort2
Willkommen bei TeX.SE. Aus der Dokumentation vonalgorithm2edu hast:
\documentclass[12pt]{article}
\usepackage[linesnumbered,lined,boxed,commentsnumbered]{algorithm2e}
\begin{document}
\IncMargin{1em}
\begin{algorithm}
$ALIGNMENTS \gets NEXT$\;
\BlankLine
\While{$(C_{cov} > 0) \wedge (|ALIGNMENTS| > 0)$}{
$NEXT \gets 0$\;
\ForEach{$A \in ALIGNMENTS$}{
$U \gets checkAlignments(\mu,A,C_{cov})$\;
\uIf{$|U| = 1$}{
$\mu \gets updateProfile(\mu,U)$\;
}
\Else{
$NEXT = NEXT \cup \{A\}$\;
}
}
\If{$|ALIGNMENTS| = |NEXT|$}{
$C_{cov} \gets C_{cov} - 1$\;
}
$ALIGNMENTS \gets NEXT$\;
}
\BlankLine
\KwRet{$\mu$}\;
\DecMargin{1em}
\end{algorithm}
\end{document}