算法标签和分页符

算法标签和分页符

我正在开始用 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来获得标题;使用适当的样式和格式,此标题可以具有与环境生成的标题相同的外观和感觉:\captionofcaptionalgorithm

\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}

此代码的一些已知问题:

  1. breakablealgorithm与正常环境相比,链接指向的位置略有不同algorithm
  2. \caption{}不可用时(这被视为很坏惯例),breakablealgorithm不会绘制两条顶部水平线,因为它们是自带的\caption{}
  3. 图形/表格浮动可能会中断breakablealgorithm
  4. 底部水平线可以放在新页面的顶部。

相关内容