将算法拆分为两列

将算法拆分为两列

考虑以下简短的例子,其中选择一个两列页面,并使用手动将算法拆分到两列中\pagebreak 在算法代码中

\documentclass[twocolumn]{article}
\usepackage[english]{babel}
\usepackage{algpseudocode}
\begin{document}

\begin{algorithmic} [1]
    \State Let $a \gets b + c$
    \State Let $a \gets b + c$
    \pagebreak
    \State Let $a \gets b + c$
    \State Let $a \gets b + c$
\end{algorithmic}

\end{document}

结果如下:

在此处输入图片描述

现在,通过将代码放入浮点数中,我不再可以通过以下方式拆分算法\pagebreak

\documentclass[twocolumn]{article}
\usepackage[english]{babel}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm*}[t]
\caption{Test}

\begin{algorithmic} [1]
    \State Let $a \gets b + c$
    \State Let $a \gets b + c$
    \pagebreak
    \State Let $a \gets b + c$
    \State Let $a \gets b + c$
\end{algorithmic}

\end{algorithm*}
\end{document}

结果:

在此处输入图片描述

如何在浮点数中获得相同的效果?您能否建议一种不特定于algpseudocodealgorithm2e同样适用于 的方法?(后者\pagebreak代码中不支持。

答案1

algorithm&algorithmic

algorithmic将您的环境包装成multicols一个。无需发出\pagebreak。参考:将一个算法放在两列中

在此处输入图片描述

\documentclass{article}

\usepackage{lipsum}
\usepackage{algorithm}
\usepackage{algpseudocode}

\usepackage{multicol}

\begin{document}

\lipsum[1]

\begin{algorithm}
    \caption{Calculate $y = x^n$}
    \label{alg1}
    \begin{multicols}{2}
        \begin{algorithmic}[1]
            \State Let $a \gets b + c$
            \State Let $a \gets b + c$
            \State Let $a \gets b + c$
            \State Let $a \gets b + c$
        \end{algorithmic}
    \end{multicols}
\end{algorithm}

\lipsum[2]

\end{document}

algorithm2e

同样的策略。但请注意,在下面的示例中,while 循环主体内不能出现分页符。一般来说,由于algorithm2e控制流宏 (\eg \While{...}) 的定义方式,使用 排版的双列算法看起来可能不如使用和algorithm2e排版的算法好看。如果我是你,我会坚持使用后者。algorithmalgorithmic

在此处输入图片描述

\documentclass{article}

\usepackage{lipsum}
\usepackage[algo2e]{algorithm2e}
\usepackage{multicol}

\begin{document}

\lipsum[1]

\begin{algorithm2e}
    \caption{Bisection}
    \label{bisect}
    \begin{multicols}{2}
            \KwIn{function $f$, reals $a,b \in D_f$ s.t. $f(a)f(b)<0$, tolerance $tol$}
            \KwOut{an approximate root of function $f$}
            \While{$(b-a)/2>tol$}
                        {$c \leftarrow (a+b)/2$\;
                        \If{$f(c)=0$}{break}
                        \eIf{$f(a)f(c)<0$}
                                {$b \leftarrow c$}
                                {$a \leftarrow c$}
                        }
            \KwRet{$(a+b)/2$}
    \end{multicols}
\end{algorithm2e}

\lipsum[2]

\end{document}

相关内容