我有 3 个算法,希望将它们显示在 2 列文档的同一列中。它们彼此之间都有细微的差异,因此将它们并排显示以便于比较非常重要。
问题是我无法找到一种方法来将这三个都放在列中。我尝试将它们放在图形环境中,但随后我收到错误“不在外部 par 模式中”。使用其他算法包对我来说不是一个选择。
答案1
这里的主要问题是在twocolumn
文档中使用浮动。虽然这是可能的,但你的需求不符合其目的。相反,caption
包裹消除浮点数的浮动性,允许您在调用它的文本中指定标题。
下列平均能量损失用途algorithmicx
'salgpseudocode
显示一个在三个算法之间略有差异的算法。使用非浮动字幕的主要界面caption
是
\captionof{<float env>}{<caption>}
因为我装了algorithm
,<float env>
即可algorithm
获得相应的标题。
\documentclass[twocolumn]{article}
\usepackage[margin=1in]{geometry}% http://ctan.org/pkg/geometry
\usepackage{algorithm,algpseudocode,lipsum}% http://ctan.org/pkg/{algorithms,algorithmicx,lipsum}
\usepackage{caption}% http://ctan.org/pkg/caption
\begin{document}
\lipsum[87]
\captionof{algorithm}{Euclid’s algorithm A}\label{euclidA}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_1\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile1}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\captionof{algorithm}{Euclid’s algorithm B}\label{euclidB}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_2\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile2}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\captionof{algorithm}{Euclid’s algorithm C}\label{euclidC}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_3\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile3}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\lipsum[1-5]
\end{document}
还有独立的capt-of
包裹做类似的事情,以及ccaption
。
将事物放在类似浮点的环境中是可能的。将算法集包装在figure
(是的,一个figure
,或table
)环境中,同时仍然使用\captionof{algorithm}
,或者将它们全部放在每个algorithm
都有的环境中\caption
。以下显示了前者:
\documentclass[twocolumn]{article}
\usepackage[margin=1in]{geometry}% http://ctan.org/pkg/geometry
\usepackage{algorithm,algpseudocode,lipsum}% http://ctan.org/pkg/{algorithms,algorithmicx,lipsum}
\usepackage{caption}% http://ctan.org/pkg/caption
\begin{document}
\lipsum[1-2]
\begin{figure}[t]
\captionof{algorithm}{Euclid’s algorithm A}\label{euclidA}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_1\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile1}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\captionof{algorithm}{Euclid’s algorithm B}\label{euclidB}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_2\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile2}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\captionof{algorithm}{Euclid’s algorithm C}\label{euclidC}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{GCD of $a$ and $b$}
\State $r_3\gets a\bmod b$
\While{$r\not=0$}\Comment{$r=0\mapsto\mbox{answer}$}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile3}
\State \textbf{return} $b$\Comment{The GCD is $b$}
\EndProcedure
\end{algorithmic}
\end{figure}
\lipsum[1-5]
\end{document}
algorithmic
您可能需要调整和之间的空间\captionof
以满足您的需要。
答案2
事实证明,您可以通过在算法末尾附加 [H] 将其转换为非浮点数。此代码适用于我想要做的事情:
\begin{figure}
\begin{algorithm}[H]
\caption{Alg 1}
\begin{algorithmic}
\end{algorithmic}
\end{algorithm}
\begin{algorithm}[H]
\caption{Alg 1}
\begin{algorithmic}
\end{algorithmic}
\end{algorithm}
\begin{algorithm}[H]
\caption{Alg 1}
\begin{algorithmic}
\end{algorithmic}
\end{algorithm}
\end{figure}