パッケージを使用してアルゴリズムを記述しようとしています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
、垂直線は複数の\hbox
es と\vtop
s を互いにネストすることによって作成されているようです。各外側\vtop
の前には が付いており\vrule
、これが各アルゴリズム ブロックの垂直線を描画します。
(注意: パッケージがブロックのインデントを計算するとき、この追加のスペースが考慮されるようです。ただし、\llap
次のコードの先頭にボックスが挿入され、累積されたスペース量だけ行番号が左に戻されるときには、このスペースは考慮されません。このスペースに 2 つの異なる次元レジスタがある理由はわかりません。)
このバグを簡単に修正するには、各垂直線の幅を、線の後に追加して「元に戻す」ことです。このパッチは、パッケージの を\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}