我正在尝试使用该包编写一个算法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}