Estoy intentando escribir un algoritmo usando el paquete algorithm2e
.
Este es mi código:
\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}
}
El problema es que los números de línea no están correctamente alineados: por ejemplo el 9 está mucho más a la derecha que el 1.
Entonces, ¿cómo puedo alinearlos horizontalmente correctamente?
Respuesta1
Esto fue bastante difícil de depurar. A primera vista, la desalineación parece arbitraria, pero si se examina más de cerca, los números se mueven más hacia la derecha cuanto más reglas verticales se utilizan en esta línea. Esto se puede ver mejor cuando se observan los pares 6/8 y 7/9:
Resulta que la cantidad de espacio adicional es en realidad (el número de reglas verticales en esa línea) x0.4pt, que es el ancho predeterminado para las reglas en LaTeX. Por lo tanto, el efecto de este error casi no se nota con tamaños de fuente estándar y bloques largos.
Profundizando un poco en el algortihm2e
código, las reglas verticales parecen crearse anidando varios \hbox
es y \vtop
s entre sí, donde cada exterior \vtop
está precedido por a \vrule
, que dibuja la regla vertical para cada bloque de algoritmo.
(NB: cuando el paquete calcula la sangría de los bloques, este espacio adicional parece tenerse en cuenta. Sin embargo, falta cuando \llap
se inserta un cuadro al comienzo del siguiente código para empujar el número de línea hacia la izquierda por un acumulado cantidad de espaciado. No estoy seguro de por qué hay dos registros de dimensiones diferentes para este espaciado).
Una solución fácil para ese error es "deshacer" el ancho de cada regla vertical agregando una \kern-0.4pt
después. Puede aplicar ese parche con bastante facilidad utilizando el \patchcmd
del etoolbox
paquete. Simplemente agregue el siguiente código a su preámbulo:
\usepackage{etoolbox}
\makeatletter
\patchcmd\algocf@Vline{\vrule}{\vrule \kern-0.4pt}{}{}
\patchcmd\algocf@Vsline{\vrule}{\vrule \kern-0.4pt}{}{}
\makeatother
El nuevo resultado proporciona números de línea correctamente alineados:
Respuesta2
Bienvenido a TeX.SE. De la documentación dealgoritmo2etienes:
\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}