algorithm2e 下如何避免注释的数字行

algorithm2e 下如何避免注释的数字行

在输入和输出数据的声明中,我想添加注释以解释数据类型。我使用:\usepackage[ruled,vlined]{algorithm2e}

我的代码是:

\begin{algorithm}[!ht]
\linesnumbered
\dontprintsemicolon
\KwData{$\mathbf{X}\in \mathbb{R}^{i\times j}$\tcp*{comment}\;
$\qquad\quad\:p_x,p_y,p_z \in \mathbb{N}$\tcp*{comment}\;
$\qquad\quad\:\alpha \in \mathbb{R}$\tcp*{comment}\;}
\KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$\tcp*{comment}\;}
.
.
.
\caption{algo}
\label{alg:name}
\end{algorithm}

不幸的是,随着 Kwdata 中注释的引入,声明被编号了。我该如何删除 kwdata 中的数字线?

答案1

这里有不少于四种方法可以做到这一点,也许第二种更可取。

  1. 使用单独的\KwData行。
  2. 定义了一个新命令\KwDataXX,它留出空间,就像Data:写入一样,但实际上并没有写入。
  3. 使用环境;这里,块aligned的右侧只能留下一条注释aligned
  4. align*在数学块本身中使用带有注释的环境

代码:

\documentclass{article}
\usepackage[ruled,vlined]{algorithm2e}
\usepackage{amsmath,amssymb}
\usepackage{cprotect}%% only needed to have \verb work in \caption

\makeatletter
\algocf@newcommand{KwDataXX}[1]{%
  \sbox\algocf@inputbox{\hbox{\KwSty{Data}\algocf@typo: }}%
  \ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}%
  {\let\\\algocf@newinput\hspace{\wd\algocf@inputbox}\hangindent=\wd\algocf@inputbox\hangafter=\wd\algocf@inputbox#1\par}%
  \algocf@linesnumbered% reset the numbering of the lines
}
\makeatother

\begin{document}
\begin{algorithm}[!ht]
\LinesNumbered
\KwData{$\mathbf{X}\in \mathbb{R}^{i\times j}$            \tcp*{comment}}
\KwData{$p_x,p_y,p_z \in \mathbb{N}$                      \tcp*{comment}}
\KwData{$\alpha \in \mathbb{R}$                           \tcp*{comment}}
\KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$ \tcp*{comment}}
\cprotect\caption{algo -- separate \verb!\KwData! lines}
\label{alg:name}
\end{algorithm}

\begin{algorithm}[!ht]
\LinesNumbered
\KwData  {$\mathbf{X}\in \mathbb{R}^{i\times j}$          \tcp*{comment}}
\KwDataXX{$p_x,p_y,p_z \in \mathbb{N}$                    \tcp*{comment}}
\KwDataXX{$\alpha \in \mathbb{R}$                         \tcp*{comment}}
\KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$ \tcp*{comment}}
\cprotect\caption{algo2 -- using the new \verb!\KwDataXX! command}
\label{alg:name2}
\end{algorithm}

\begin{algorithm}[!ht]
\LinesNumbered
\DontPrintSemicolon
\KwData{%
  $\begin{aligned}
    \mathbf{X}  & \in \mathbb{R}^{i\times j}\\
    p_x,p_y,p_z & \in \mathbb{N}\\
    \alpha      & \in \mathbb{R}
  \end{aligned}$\tcp*{comment}
}
\KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$}
\cprotect\caption{algo3 -- using an \verb!aligned! environment, only one comment possible}
\label{alg:name3}
\end{algorithm}

\begin{algorithm}[!ht]
\LinesNumbered
\KwData{%
  \begin{align*}
    \mathbf{X}  & \in \mathbb{R}^{i\times j} && \text{comment}\\
    p_x,p_y,p_z & \in \mathbb{N} && \text{comment} \\
    \alpha      & \in \mathbb{R} && \text{comment}
  \end{align*}%
}
\KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$}
\cprotect\caption{algo4 -- using \verb!align*! with in-math comments}
\label{alg:name4}
\end{algorithm}
\end{document}

示例输出

答案2

我通常在需要编号的每一行上使用\LinesNumberedHiddenbefore \begin{algorithm},然后使用。\ShowLn

例如:

\LinesNumberedHidden
\begin{algorithm}[H]
  \dontprintsemicolon
  \KwData{$\mathbf{X}\in \mathbb{R}^{i\times j}$\tcp*{comment}\;
  $\qquad\quad\:p_x,p_y,p_z \in \mathbb{N}$\tcp*{comment}\;
  $\qquad\quad\:\alpha \in \mathbb{R}$\tcp*{comment}\;}
  \KwResult{$\mathcal{X}\in \mathbb{R}^{i\times j\times k}$\tcp*{comment}\;}
 \ShowLn Line 2
 \ShowLn Line 3 etc...
\end{algorithm}

虽然我知道前面的答案实际上是实现此目的的通用且有效方法,但我认为这是最简单的方法。我知道从技术上讲,您必须在每一行上使用 \ShowLn 命令来执行此算法,但至少您不必定义新命令。

\LinesNumberedHidden命令仅适用于下一个算法环境,而不适用于文档中的其余算法。所以,这也是我觉得它很方便的另一个原因。

相关内容