如何使用 algorithm2e 包获取“紧密”的盒装算法

如何使用 algorithm2e 包获取“紧密”的盒装算法

我使用该algorithm2e包来编写伪代码,因为我喜欢该包提供的选项。但是,该boxed选项会给出一个文本宽度大小的框,当代码更窄时,它对我来说看起来不太有吸引力。这是一个 MWE。

\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} %
\usepackage{amssymb}

% real R
\newcommand{\R}{\mathbb{R}}

\usepackage[noline, boxed]{algorithm2e}

\begin{document}

 % ALGORITHM
 \begin{algorithm}
 \DontPrintSemicolon
 % \SetKwData{Left}{left} % normal
 \SetKwFunction{SDud}{SDud}\SetKwFunction{Tol}{tol}\SetKwFunction{Break}{break}% tt
 \SetKwInOut{Input}{input}
 \BlankLine
 \Input{$A \in \R^{m \times n} (m<n), \:\: b \in \R^m, \:\: x_{(0)}\in \R^n$.}
 \BlankLine
 \emph{\% Initialization}\;
 $x = x_{(0)}$\;
 $r = b - Ax$\;
 $p = A^Tr$\;
 \BlankLine
 \emph{\% Start \SDud}\;
 \For{$t = 0,1,2\ldots,t_{\max}$}{
  \BlankLine
  \emph{\% Compute $\alpha_{(t)}$}\;
  $q = Ap$ \;
  $\rho = p^Tp, \: \sigma = q^Tq, \: \alpha = \rho / \sigma$ \;
  \BlankLine
  \emph{\% Check for convergence}\;
  \lIf{$\rho \leq$ \Tol}{\Break}
  \BlankLine
  \emph{\% Compute new iterate $x_{(t+1)}$}\;
  $x \leftarrow x + \alpha p$
  \BlankLine
  \emph{\% Update residual $p_{(t+1)}$}\;
  $w = A^Tq$ \;
  $p \leftarrow p - \alpha w$
 }
 \caption{My alg}
 \end{algorithm}

\end{document}

它看起来是这样的:

在此处输入图片描述

我不喜欢右边的空白,所以我希望它是一个紧密的、居中的框,围绕着伪代码。不幸的是algorithm2e documentation没有为我提供有关此问题的任何见解。有人能帮我吗?

欢呼

答案1

改编自托马斯·F·斯特姆解决这个问题。您可以使algorithm不可浮动,并将其放入另一个可浮动环境中——在本例中,是一个不可见的tcolorbox。更改宽度变量以适应 周围的框algorithm

\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} %
\usepackage{amssymb}
\usepackage[noline,boxed]{algorithm2e}
\usepackage[skins]{tcolorbox}

% real R
\newcommand{\R}{\mathbb{R}}

\begin{document}

\begin{tcolorbox}[blanker,width=(\linewidth-3.5cm)]
\begin{algorithm}[H]
 \DontPrintSemicolon
 % \SetKwData{Left}{left} % normal
 \SetKwFunction{SDud}{SDud}\SetKwFunction{Tol}{tol}\SetKwFunction{Break}{break}% tt
 \SetKwInOut{Input}{input}
 \BlankLine
 \Input{$A \in \R^{m \times n} (m<n), \:\: b \in \R^m, \:\: x_{(0)}\in \R^n$.}
 \BlankLine
 \emph{\% Initialization}\;
 $x = x_{(0)}$\;
 $r = b - Ax$\;
 $p = A^Tr$\;
 \BlankLine
 \emph{\% Start \SDud}\;
 \For{$t = 0,1,2\ldots,t_{\max}$}{
  \BlankLine
  \emph{\% Compute $\alpha_{(t)}$}\;
  $q = Ap$ \;
  $\rho = p^Tp, \: \sigma = q^Tq, \: \alpha = \rho / \sigma$ \;
  \BlankLine
  \emph{\% Check for convergence}\;
  \lIf{$\rho \leq$ \Tol}{\Break}
  \BlankLine
  \emph{\% Compute new iterate $x_{(t+1)}$}\;
  $x \leftarrow x + \alpha p$
  \BlankLine
  \emph{\% Update residual $p_{(t+1)}$}\;
  $w = A^Tq$ \;
  $p \leftarrow p - \alpha w$
 }
 \caption{My alg}
\end{algorithm}
\end{tcolorbox}

\end{document}

我的结果如下:

tcolorbox 中的算法

答案2

我从其他主题中找到了解决方案,尽管我认为它不是最优雅的解决方案。您可以使用它来实现,minpages但您必须为您的algorthm环境提供[H]说明符,使其不再是float。我更希望它仍然是一个float,但它可以做到......

以下是一个例子

\begin{center}
\begin{minipage}{0.7\textwidth}
\begin{algorithm}[H]
 \DontPrintSemicolon
 % \SetKwData{Left}{left} % normal
 \SetKwFunction{SDud}{SDud}\SetKwFunction{Tol}{tol}\SetKwFunction{Break}{break}% tt
 \SetKwInOut{Input}{input}
 \BlankLine
 \Input{$A \in \R^{m \times n} (m<n), \:\: b \in \R^m, \:\: x_{(0)}\in \R^n$.}
 \BlankLine
 \emph{\% Initialization}\;
 $x = x_{(0)}$\;
 $r = b - Ax$\;
 $p = A^Tr$\;
 \BlankLine
 \emph{\% Start \SDud}\;
 \For{$t = 0,1,2\ldots,t_{\max}$}{
  \BlankLine
  \emph{\% Compute $\alpha_{(t)}$}\;
  $q = Ap$ \;
  $\rho = p^Tp, \: \sigma = q^Tq, \: \alpha = \rho / \sigma$ \;
  \BlankLine
  \emph{\% Check for convergence}\;
  \lIf{$\rho \leq$ \Tol}{\Break}
  \BlankLine
  \emph{\% Compute new iterate $x_{(t+1)}$}\;
  $x \leftarrow x + \alpha p$
  \BlankLine
  \emph{\% Update residual $p_{(t+1)}$}\;
  $w = A^Tq$ \;
  $p \leftarrow p - \alpha w$
 }
 \caption{My alg}
 \end{algorithm}
\end{minipage}
\end{center}

仍然欢迎任何改进。

答案3

我建议使用figure环境作为包装器,以将算法保持为浮点数。如果不在图中增加标题或标签,则不会出现问题\listoffigures

\begin{figure}[htb]
    \centering
    \begin{minipage}{.7\linewidth}
    \begin{algorithm}[H]
        \KwData{this text}
        \KwResult{how to write algorithm with \LaTeX2e }
        initialization\;
        \While{not at end of this document}{
            read current\;
            \eIf{understand}{
                go to next section\;
                current section becomes this one\;
            }{
                go back to the beginning of current section\;
            }
        }
        \caption{How to write algorithms}
        \label{algo:black draw}
    \end{algorithm}
  \end{minipage}
\end{figure}

您还可以采用更清晰的解决方案,即定义一个新的环境来包装所有内容,如下所述这个话题

相关内容