我使用该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}
我的结果如下:
答案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}
您还可以采用更清晰的解决方案,即定义一个新的环境来包装所有内容,如下所述这个话题