패키지 알고리즘2e를 사용하여 줄 번호를 가로로 정렬하는 방법

패키지 알고리즘2e를 사용하여 줄 번호를 가로로 정렬하는 방법

패키지를 사용하여 알고리즘을 작성하려고 합니다 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.4pt이며 이는 LaTeX 규칙의 기본 너비입니다. 따라서 이 버그의 영향은 표준 글꼴 크기와 긴 블록에서는 거의 눈에 띄지 않습니다.

코드를 조금 살펴보면 수직 규칙은 여러 개의 es와 s를 서로 algortihm2e중첩하여 생성되는 것으로 보입니다 . 각 외부 규칙 앞에는 각 알고리즘 블록에 대한 수직 규칙이 그려집니다.\hbox\vtop\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}

관련 정보