如何使用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解決該錯誤的一個簡單方法是透過在每個垂直線後面添加 來「撤消」每個垂直線的寬度。您可以使用套件\patchcmd中的輕鬆套用該補丁etoolbox。只需將以下程式碼新增至您的序言:

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

相關內容