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

введите описание изображения здесь

Оказывается, величина дополнительного интервала на самом деле составляет (количество вертикальных линий на этой строке)x0.4pt, что является шириной по умолчанию для линий в LaTeX. Поэтому эффект этой ошибки почти не заметен при стандартных размерах шрифта и длинных блоках.

Если немного покопаться в algortihm2eкоде, то вертикальные правила, похоже, создаются путем вложения нескольких \hboxes и \vtops друг в друга, где каждому внешнему элементу \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}

Связанный контент