Cómo alinear números de línea horizontalmente con el paquete Algoritm2e

Cómo alinear números de línea horizontalmente con el paquete Algoritm2e

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}
}  

Y este es el resultado: ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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 algortihm2ecódigo, las reglas verticales parecen crearse anidando varios \hboxes y \vtops entre sí, donde cada exterior \vtopestá 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 \llapse 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.4ptdespués. Puede aplicar ese parche con bastante facilidad utilizando el \patchcmddel etoolboxpaquete. 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:

ingrese la descripción de la imagen aquí

Respuesta2

Bienvenido a TeX.SE. De la documentación dealgoritmo2etienes:

ingrese la descripción de la imagen aquí

\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}

información relacionada