我正在开始用 LaTeX 进行实验,我正在写一篇文章,我想要的只是在普通文本中嵌入一个算法,这是我的代码:
\documentclass{article}
\usepackage{algorithmic}
\begin{document}
\section{Lettura file .gpx}
Lorem ipsum ...
\algsetup{indent=1.7em}
\begin{algorithm}
\caption{Alg capt}
\label{alg1}
\begin{algorithmic}[1]
... algorithm here...
\end{algorithmic}
\end{algorithm}
\end{document}
这是完全可行的,但算法会自动使用分页符,我该如何避免这种分页符并在“lorem ipsum”部分之后立即显示算法?
答案1
以下是一些建议:
如果你在浮点数中添加算法
algorithm
,那么它将根据作为环境的可选参数给出的“浮点说明符”进行浮动algorithm
。例如\begin{algorithm}[ht] ... \end{algorithm}
要强制浮点数不那么浮动,请添加!
到浮点说明符。但是,正如float
包裹,这仍然是一个“暗示说明符”。相反,该包提供了额外的H
浮点说明符,告诉 LaTeX“把它放在这里!”
使用
algorithmx
包裹. 它非常类似于algorithmic
,但允许更多的灵活性。这是一个简短但完整的最小示例(来自algorithmicx
包装文档)。如果您希望算法跨越页面边界,则必须进行不同的设置。我
breakablealgorithm
在下面整合了一个环境。
\documentclass{article}
\usepackage{algorithm,algpseudocode}
\usepackage{lipsum}
\makeatletter
\newenvironment{breakablealgorithm}
{% \begin{breakablealgorithm}
\begin{center}
\refstepcounter{algorithm}% New algorithm
\hrule height.8pt depth0pt \kern2pt% \@fs@pre for \@fs@ruled
\renewcommand{\caption}[2][\relax]{% Make a new \caption
{\raggedright\textbf{\fname@algorithm~\thealgorithm} ##2\par}%
\ifx\relax##1\relax % #1 is \relax
\addcontentsline{loa}{algorithm}{\protect\numberline{\thealgorithm}##2}%
\else % #1 is not \relax
\addcontentsline{loa}{algorithm}{\protect\numberline{\thealgorithm}##1}%
\fi
\kern2pt\hrule\kern2pt
}
}{% \end{breakablealgorithm}
\kern2pt\hrule\relax% \@fs@post for \@fs@ruled
\end{center}
}
\makeatother
\begin{document}
\listofalgorithms
\section{Some section}
\lipsum[1]
\begin{algorithm}[H]
\caption{Euclid’s algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d.\ of~$a$ and~$b$}
\State $r \gets a \bmod b$
\While{$r \neq 0$}\Comment{We have the answer if~$r$ is~$0$}
\State $a \gets b$
\State $b \gets r$
\State $r \gets a \bmod b$
\EndWhile
\State \textbf{return} $b$\Comment{The g.c.d.\ is~$b$}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\lipsum[2]
\begin{breakablealgorithm}
\caption{Euclid’s algorithm}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d.\ of~$a$ and~$b$}
\State $r \gets a \bmod b$
\While{$r \neq 0$}\Comment{We have the answer if~$r$ is~$0$}
\State $a \gets b$
\State $b \gets r$
\State $r \gets a \bmod b$
\EndWhile
\State \textbf{return} $b$\Comment{The g.c.d.\ is~$b$}
\EndProcedure
\end{algorithmic}
\end{breakablealgorithm}
\end{document}
上述的重新定义\caption
假定它将被放置在算法中它所在的位置;具体来说是在顶部。规则定义取自float
包的\@fs@ruled
构造。
答案2
如果你不想让你的算法被视为漂浮物体,那么不使用环境;您仍然可以使用包中的命令algorithm
来获得标题;使用适当的样式和格式,此标题可以具有与环境生成的标题相同的外观和感觉:\captionof
caption
algorithm
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{caption}
\usepackage{lipsum}
\DeclareCaptionFormat{algor}{%
\hrulefill\par\offinterlineskip\vskip1pt%
\textbf{#1#2}#3\offinterlineskip\hrulefill}
\DeclareCaptionStyle{algori}{singlelinecheck=off,format=algor,labelsep=space}
\captionsetup[algorithm]{style=algori}
\begin{document}
\section{Lettura file .gpx}
\lipsum*[1]
\begin{center}
\captionof{algorithm}{Euclid’s algorithm}\label{euclid}
\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}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile
\State \textbf{return} $b$\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\end{center}
\end{document}
答案3
我在这里的做法主要基于 Werner 的惊人回答,但有一个重大修复:我使用 将两个顶部垂直线和一个标题分组为不可拆分的页面块\parbox{}
。
下面是在 Kubuntu 20.04.2 LTS 上使用 pdfTeX 3.14159265-2.6-1.40.20(TeX Live 2019/Debian)成功编译的 MME:
\documentclass{article}
\usepackage{algorithm, algpseudocode}
\usepackage{lipsum}
\makeatletter
\newenvironment{breakablealgorithm}
{
\begin{center}
\refstepcounter{algorithm}
\renewcommand{\caption}[1]
{
\addcontentsline{loa}{algorithm}{\protect\numberline{\thealgorithm}##1}
\parbox{\textwidth}
% Makes a unbreakable block and can also be done by `minipage`.
{
\hrule height.8pt depth0pt \kern2pt
{\raggedright\textbf{\fname@algorithm~\thealgorithm} ##1\par}
\kern2pt\hrule\kern2pt
}
}
}
{
\kern2pt\hrule\relax
\end{center}
}
\makeatother
\begin{document}
\listofalgorithms
\section{Section One}
\lipsum[1]
\begin{breakablealgorithm}
\caption{Euclid's algorithm}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a, b$}
\State $r \gets a \bmod b$
\While{$r \not= 0$}
\State $a \gets b$
\State $b \gets r$
\State $r \gets a \bmod b$
\EndWhile
\State \textbf{return} $b$
\EndProcedure
\end{algorithmic}
\end{breakablealgorithm}
\lipsum[2]
\begin{breakablealgorithm}
\caption{Euclid's algorithm}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a, b$}
\State $r \gets a \bmod b$
\While{$r \not= 0$}
\State $a \gets b$
\State $b \gets r$
\State $r \gets a \bmod b$
\EndWhile
\State \textbf{return} $b$
\EndProcedure
\end{algorithmic}
\end{breakablealgorithm}
\end{document}
此代码的一些已知问题:
breakablealgorithm
与正常环境相比,链接指向的位置略有不同algorithm
;- 当
\caption{}
不可用时(这被视为很坏惯例),breakablealgorithm
不会绘制两条顶部水平线,因为它们是自带的\caption{}
; - 图形/表格浮动可能会中断
breakablealgorithm
; - 底部水平线可以放在新页面的顶部。