パッケージ 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 のペアを見るとよくわかります。

ここに画像の説明を入力してください

実際には、余分なスペースの量は (その行の垂直罫線の数) x 0.4 pt であり、これは LaTeX の罫線のデフォルトの幅です。したがって、このバグの影響は、標準のフォント サイズと長いブロックではほとんど目立ちません。

コードを少し調べてみるとalgortihm2e、垂直線は複数の\hboxes と\vtops を互いにネストすることによって作成されているようです。各外側\vtopの前には が付いており\vrule、これが各アルゴリズム ブロックの垂直線を描画します。

(注意: パッケージがブロックのインデントを計算するとき、この追加のスペースが考慮されるようです。ただし、\llap次のコードの先頭にボックスが挿入され、累積されたスペース量だけ行番号が左に戻されるときには、このスペースは考慮されません。このスペースに 2 つの異なる次元レジスタがある理由はわかりません。)

このバグを簡単に修正するには、各垂直線の幅を、線の後に追加して「元に戻す」ことです。このパッチは、パッケージの を\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}

関連情報