我正在嘗試使用該包編寫一個演算法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
,垂直規則似乎是透過將多個\hbox
es 和\vtop
s 相互嵌套來創建的,其中每個外部\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}