如何使用 algorithm2e 包水平对齐行号

如何使用 algorithm2e 包水平对齐行号

我正在尝试使用该包编写一个算法algorithm2e

这是我的代码:

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

结果如下: 在此处输入图片描述

问题在于行号未正确对齐:例如,9 比 1 在右边多得多。

那么,我怎样才能正确地水平对齐它们?

答案1

这很难调试。乍一看,错位似乎是任意的,但仔细检查后,数字向右移动得越远,这条线上使用的垂直规则就越多。从 6/8 和 7/9 对可以看出这一点:

在此处输入图片描述

事实证明,额外间距的数量实际上是(该行上的垂直规则数)x0.4pt,这是 LaTeX 中规则的默认宽度。因此,对于标准字体大小和长块,此错误的影响几乎不明显。

在代码中深入挖掘一下algortihm2e,垂直规则似乎是通过将几个\hboxes 和\vtops 嵌套在一起而创建的,其中每个外部\vtop前面都有一个\vrule,它为每个算法块绘制垂直规则。

(注意:当包计算块的缩进时,似乎考虑到了这个额外的间距。但是,当\llap在下面的代码的开头插入一个框以将行号向左推回累积的间距量时,它会丢失。我不确定为什么这个间距有两个不同的维度寄存器。)

修复该错误的一个简单方法是通过在每条垂直线后面添加一个来“撤消”该线的宽度。您可以使用包中的\kern-0.4pt轻松应用该补丁。只需将以下代码添加到您的序言中:\patchcmdetoolbox

\usepackage{etoolbox}

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

新的输出给出了正确对齐的行号:

在此处输入图片描述

答案2

欢迎来到 TeX.SE。来自算法2e你有:

在此处输入图片描述

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

相关内容