想要 algorithm2e 算法中的 Knuth 风格行号

想要 algorithm2e 算法中的 Knuth 风格行号

使用该包获取 Knuth 风格的算法行号的最佳方法是什么algorithm2e?即,不要对算法行进行编号,因为1, 2, 3, ...每个行号都应包含一个前缀,即算法编号,例如,3.1 3.2, 3.2...

使用algorithm2elatex 包时,行会编号,1, 2, 3,...我可以使用以下方法添加前缀和后缀\SetNlSty{textbf}{\ref{algo.rte}.}{}

这样算法编号就会作为前缀出现。例如,算法 3 的行被编号3.1, 3.2, 3.3,等等...但这实际上还不够,因为当我稍后使用 引用行号时\ref{..label...},引用只会抓取数字,而不是前缀。

这是受 Knuth 在《计算机编程艺术》中对算法行进行编号的方式启发,只不过他的算法是带有字母的数字,因此行号例如B1, B2, B3... 在此处输入图片描述

这是我尝试过的乳胶代码。

\documentclass[a4paper]{article}
\usepackage{amsmath}
\usepackage[linesnumbered,ruled,vlined]{algorithm2e}
\makeatletter
\renewcommand{\theAlgoLine}{%
  \@arabic{\numexpr\value{algocf}+1\relax}.\arabic{AlgoLine}}
\makeatother
\begin{document}
\begin{algorithm}[H]
\DontPrintSemicolon % Some LaTeX compilers require you to use \dontprintsemicolon instead
    \While{true} { \label{algo.rte.1300}
      $V' \gets \{u \in U | u' \in U\setminus\{u\} \implies u \perp u'\}$ \label{algo.rte.1301}\;
      $U \gets U \setminus V'$ \label{algo.rte.1304}\;
      \uIf{$U = \emptyset$} {
        \Return{$V$} \label{algo.rte.1305}\;
      }}
\caption{Finds the maximal disjoint decomposition}
\label{algo.rte}
\end{algorithm}

\vbox{Notes about Algorithm~\ref{algo.rte}:
  \begin{itemize}
  \item[Line \ref{algo.rte.1301}] we find the set, $V'$ of all elements
    of $U$ which are disjoint from all other elements of $U$.  Notice
    that if $U$ is a singleton set, then
    $V'$ is that singleton element, thus $U \gets \emptyset$ on
    line~\ref{algo.rte.1304}.
  \item[Line \ref{algo.rte.1301}] This is of course an
    $\mathcal{O}(n^2)$ search, and what is worse, it is repeated each
    time through the loop headed on line~\ref{algo.rte.1300}.
  \item[Line \ref{algo.rte.1305}] If $U = \emptyset$ then we have
    collected all the disjoint sets into $V$.    
\end{itemize}}

\end{document}

答案1

请注意,选项 algonl 已经这样做了,无需重新定义 \TheAlgoNl。还请注意,您需要先放置标题才能获得正确的编号。

答案2

如果你的标题低于算法,

\documentclass{article}
\usepackage[linesnumbered]{algorithm2e}

\makeatletter
\renewcommand{\theAlgoLine}{%
  \@arabic{\numexpr\value{algocf}+1\relax}.\arabic{AlgoLine}}
\makeatother

\begin{document}

\begin{algorithm}
\SetKwData{Left}{left}\SetKwData{This}{this}\SetKwData{Up}{up}
\SetKwFunction{Union}{Union}\SetKwFunction{FindCompress}{FindCompress}
\SetKwInOut{Input}{input}\SetKwInOut{Output}{output}
\Input{A bitmap $Im$ of size $w\times l$}
\Output{A partition of the bitmap}
\BlankLine
\emph{special treatment of the first line}\;
\For{$i\leftarrow 2$ \KwTo $l$}{
  \emph{special treatment of the first element of line $i$}\;
  \For{$j\leftarrow 2$ \KwTo $w$}{\label{forins}
    \Left$\leftarrow$ \FindCompress{$Im[i,j-1]$}\;
    \Up$\leftarrow$ \FindCompress{$Im[i-1,]$}\;
    \This$\leftarrow$ \FindCompress{$Im[i,j]$}\;
    \If(\tcp*[h]{O(\Left,\This)==1}){\Left compatible with \This}{\label{lt}
      \lIf{\Left $<$ \This}{\Union{\Left,\This}}
      \lElse{\Union{\This,\Left}}
    }
    \If(\tcp*[f]{O(\Up,\This)==1}){\Up compatible with \This}{\label{ut}
      \lIf{\Up $<$ \This}{\Union{\Up,\This}}
      \tcp{\This is put under \Up to keep tree as flat as possible}\label{cmt}
      \lElse{\Union{\This,\Up}}\tcp*[h]{\This linked to \Up}\label{lelse}
    }
  }
  \lForEach{element $e$ of the line $i$}{\FindCompress{p}}
}
\caption{disjoint decomposition}\label{algo_disjdecomp}
\end{algorithm}

\end{document}

如果将标题放在上面,则应\thealgocf使用 而不是\@arabic{\numexpr\value{algocf}+1\relax}

在此处输入图片描述

相关内容