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}
}
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:
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 algortihm2e
código, as regras verticais parecem ser criadas aninhando vários \hbox
es e \vtop
s 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 \llap
caixa é 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.4pt
depois dela. Você pode aplicar esse patch facilmente usando \patchcmd
o etoolbox
pacote. 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:
Responder2
Bem-vindo ao TeX.SE. Da documentação dealgoritmo2evocê tem:
\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}