Como alinhar os números das linhas horizontalmente com o pacote algoritmo2e

Como alinhar os números das linhas horizontalmente com o pacote algoritmo2e

Estou tentando escrever um algoritmo usando o pacote algorithm2e.

Este é o meu 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}
}  

E este é o resultado: insira a descrição da imagem aqui

O problema é que os números das linhas não estão devidamente alinhados: por exemplo, o 9 está muito mais à direita do que o 1.

Então, como posso alinhá-los horizontalmente corretamente?

Responder1

Isso foi muito difícil de depurar. À primeira vista, o desalinhamento parece arbitrário, mas, examinando mais de perto, os números movem-se tanto para a direita quanto mais regras verticais são usadas nesta linha. Isso pode ser visto melhor quando olhamos para os pares 6/8 e 7/9:

insira a descrição da imagem aqui

Acontece que a quantidade de espaçamento extra é na verdade (o número de regras verticais naquela linha) x0,4pt, que é a largura padrão para regras no LaTeX. Portanto, o efeito desse bug quase não é perceptível com tamanhos de fonte padrão e blocos longos.

Investigando um pouco o algortihm2ecódigo, as regras verticais parecem ser criadas aninhando vários \hboxes e \vtops uns nos outros, onde cada exterior \vtopé precedido por um \vrule, que desenha a regra vertical para cada bloco de algoritmo.

(Nota: Quando o pacote calcula o recuo dos blocos, este espaçamento adicional parece ser levado em consideração. No entanto, falta quando uma \llapcaixa é inserida no início do código seguinte para empurrar o número da linha de volta para a esquerda por um acumulado quantidade de espaçamento. Não sei por que existem dois registros de dimensão diferentes para esse espaçamento.)

Uma solução fácil para esse bug é “desfazer” a largura de cada regra vertical adicionando um \kern-0.4ptdepois dela. Você pode aplicar esse patch facilmente usando \patchcmdo etoolboxpacote. Basta adicionar o seguinte código ao seu preâmbulo:

\usepackage{etoolbox}

\makeatletter
\patchcmd\algocf@Vline{\vrule}{\vrule \kern-0.4pt}{}{}
\patchcmd\algocf@Vsline{\vrule}{\vrule \kern-0.4pt}{}{}
\makeatother

A nova saída fornece números de linha alinhados corretamente:

insira a descrição da imagem aqui

Responder2

Bem-vindo ao TeX.SE. Da documentação dealgoritmo2evocê tem:

insira a descrição da imagem aqui

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

informação relacionada