Я пытаюсь написать алгоритм с использованием пакета 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}