如何将多个算法绑定在一起,使它们彼此相邻显示。目前,LaTeX 将算法放置得彼此很远。
答案1
一些不太理想的方法
将算法保持在一起的一种方法是对两个浮点数使用相同的浮点说明符:
%...
\begin{algorithm}[t]% First algorithm
%...
\end{algorithm}
\begin{algorithm}[t]% Second algorithm
%...
\end{algorithm}
%...
LaTeX 将确保它们按顺序排列,因为浮点数由以 FIFO(先进先出)方式刷新的列表管理。但是,这非常不可靠,因为浮点数的放置取决于页面上已有的浮点数以及页面上的剩余空间。因此,以这种方式很容易破坏算法。
另一种尝试是使用H
另一种尝试float
包裹。这个浮点说明符实际上删除了浮点数的浮动性,并将其放置在调用环境的文本中:
%...
\begin{algorithm}[H]% First algorithm
%...
\end{algorithm}
\begin{algorithm}[H]% Second algorithm
%...
\end{algorithm}
%...
虽然这种方法效果很好,但会失去浮点数提供的移动性,因此算法会出现在放置它们的位置。此外,这种方法在页面边界附近并不完美,因为两个算法可能会分开。此外,如果对H
某些算法使用浮点说明符,而对其他非粘在一起的算法使用其他(常规)浮点说明符,效果可能会更糟。下面是一个说明这个有问题实例的小例子:
\documentclass{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{float}% http://ctan.org/pkg/float
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}
\listofalgorithms
\section{First section}
\lipsum[1-2]
\begin{algorithm}[H]
\caption{First algorithm}\label{first-alg}%
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
\State $r\gets a\bmod b$
\While{$r\not=0$}\Comment{We have the answer if r is 0}
\algstore{euclidA}
\end{algorithmic}
\end{algorithm}
\begin{algorithm}[H]
\caption{Second algorithm}\label{second-alg}
\begin{algorithmic}[1]
\algrestore{euclidA}
\State $a\gets b$
\State $b\gets r$
\algstore{euclidB}
\end{algorithmic}
\end{algorithm}
\lipsum[2]
\section{Second section}
\lipsum[3]
\begin{algorithm}[t]
\caption{Third algorithm}\label{third-alg}
\begin{algorithmic}[1]
\algrestore{euclidB}
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile}
\State \textbf{return} $b$\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\lipsum[4]
\end{document}
选择这个示例是为了打破两种算法应该一起出现在第一页边界上,而第三种算法则保持浮动的局面。因此,输出中显示的算法顺序是混乱的:算法 1 后面是算法 3,算法 3 后面是算法 2:
不仅如此,从输出结果(点击放大)可以看出,“算法列表”中的顺序也是不正确的。
稍微手动(但实用)的方法
这个想法是使用现有的浮点数(如figure
)作为浮点包装器,并定义一些命令来模仿algorithm
包裹. 使用 afigure
作为浮动包装器是完全没问题的,只要\caption
里面没有使用“官方的”(这将排版为 a数字标题,并最终进入 LoF)。
我决定使用ruled
的浮动样式algorithm
。此外,我选择了algpseudocode
(从algorithmicx
捆) 用于在环境中排版算法。包 (也来自捆绑包)algorithmic
提供了类似的功能,因此该示例是可转移的*。algorithmic
algorithms
为了模仿 的字幕样式,应使用ruled
新的宏。这将排版一条粗线 ( ),后跟标题(左对齐),后跟另一条线 ( ),后者直接取自\algcaption[<LoA>]{<caption>}
0.8pt
\toprule
\midrule
float
包裹。algorithmic
环境应该用 来完成\bottomrule
,使得方法非常tabular
类似。
\documentclass{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{ifmtarg}% http://ctan.org/pkg/ifmtarg
\makeatletter
\newcommand{\listofalgorithms}{\listof{algorithm}{List of Algorithms}}%
\newcommand{\toprule}{\hrule height.8pt depth0pt \kern2pt} % Caption top horizontal rule+skip
\newcommand{\midrule}{\kern2pt\hrule\kern2pt} % Caption bottom (or mid) horizontal rule+skip
\newcommand{\bottomrule}{\kern2pt\hrule\relax}% Algorithm bottom rule
\newcommand{\algcaption}[2][]{%
\refstepcounter{algorithm}%
\@ifmtarg{#1}
{\addcontentsline{loa}{figure}{\protect\numberline{\thealgorithm}{\ignorespaces #2}}}
{\addcontentsline{loa}{figure}{\protect\numberline{\thealgorithm}{\ignorespaces #1}}}%
\toprule
\textbf{\fname@algorithm~\thealgorithm}\ #2\par % Caption
\midrule
}
\makeatother
\begin{document}
\listofalgorithms
\section{First section}
\lipsum[1-3]
\begin{figure}[ht]
\algcaption{First algorithm}\label{first-alg}%
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
\State $r\gets a\bmod b$
\While{$r\not=0$}\Comment{We have the answer if r is 0}
\algstore{euclidA}
\end{algorithmic}
\bottomrule
\bigskip
\algcaption{Second algorithm}\label{second-alg}
\begin{algorithmic}[1]
\algrestore{euclidA}
\State $a\gets b$
\State $b\gets r$
\algstore{euclidB}
\end{algorithmic}
\bottomrule
\end{figure}
\lipsum[2]
\section{Second section}
\lipsum[3]
\begin{algorithm}[t]
\caption{Third algorithm}\label{third-alg}
\begin{algorithmic}[1]
\algrestore{euclidB}
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile}
\State \textbf{return} $b$\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\lipsum[4]
\end{document}
旨在以这种方式结合在一起的算法包含在同一包装器 float (figure
在本例中)中,并使用 分隔\bigskip
(大致与其他浮点数之间的空间相匹配)。使用float
创建algorithm
浮点数(而不是使用algorithm
包)只是为了能够利用诸如\listofalgorithms
以及algorithm
计数器之类的东西。
示例中使用的其他软件包包括lipsum
(非必需)用于虚拟文本和ifmtarg
包裹(必需)检查是否为空参数\algcaption
。
*这algorithmicx
捆提供了更多高级功能,包括存储/恢复设置的可能性algorithmic
(在上述示例中使用过),这是algorithms
捆。
答案2
在两种算法之间,使用以下代码:
\vspace{-0.5cm}
您可以在 {} 中设置任意数字,负值将缩小间距。