带有 algorithm2e 包的独立文档

带有 algorithm2e 包的独立文档

我正在尝试生成一个包含算法的 pdf 文件,该文件将作为图形包含在主文档中。我尝试使用独立版本,如下所示:

% main.tex
\documentclass{standalone}
\usepackage{algorithm2e}
\begin{document}
\begin{algorithm}
$x \gets 0$\;
\If{$x < 10$}{
  $x \gets x + 1$\;
}
\end{algorithm}
\end{document}

上述示例在编译时出现多个错误,无法生成正确的布局。我尝试了几个选项standalone(例如previewvarwidth),但未能使其工作。有一个类似的问题(使用 algorithmicx 或 algorithm2e 独立运行),但它相当老旧,没有合适的答案。我已经用 algorithm2e 编写了算法,所以我不想使用其他算法包。我只是需要一个可行的示例。

答案1

算法设置在浮动环境中,而standalone内容则放在盒子中。这是不兼容的。

但是,如果你给算法提供[H]选项,它将不再是浮动的,所以你可以使用它。除非你使用capt-ofcaption包,否则它将不再有可能有标题,但你可能会将标题放在主文档中。

请注意,无法将算法裁剪到其最小水平空间,因为包algorithm会将它们放在几层框中,其中一些框具有明确的宽度\hsize。 但我想您希望它们都具有相同的宽度,您只需将其设置为所需的宽度即可\hsize

\documentclass[boxed,border=2pt]{standalone}
\usepackage{algorithm2e}
\begin{document}
\hsize=10cm
\setlength{\algomargin}{10pt}
  \begin{algorithm}[H]
    $x \gets 0$\; 
    \If{$x < 10$}{ $x \gets x + 1$\; }
  \end{algorithm}
\end{document}

在此处输入图片描述

但是如果您需要另一个文档中的算法,带有框架和图形标题,为什么不把它们放在那里并使用这些figure,boxed选项呢?

\documentclass{article}
\usepackage[figure,boxed]{algorithm2e}
\begin{document}
\listoffigures
\section{Introduction}

This is my algorithm.

  \begin{algorithm}
    $x \gets 0$\; 
    \If{$x < 10$}{ $x \gets x + 1$\; }
    \caption{This is the algorithm}
  \end{algorithm}

This is the end of the document

\end{document}

在此处输入图片描述

这会使它们浮动(它使用真实figure环境,因此它们最终可能会位于不同的位置,就像所有浮动一样。您可以通过使用\usepackage{float},然后来防止这种情况\begin{algorithm}[H]。但是,如果算法不适合,这可能会导致页面上出现不必要的空白。

您也可以删除该figure选项;这样algorithm环境就会有一个[H]选项,使算法不浮动。但您必须使用caption-ofcaption包添加标题。在这种情况下,标题将放在框外。

\documentclass{article}
\usepackage[boxed]{algorithm2e}
\usepackage{capt-of}
\begin{document}
\listoffigures
\section{Introduction}

This is my algorithm.
  
  \SetAlgoSkip{medskip}
  \SetAlCapSkip{2ex}
  \begin{algorithm}[H]
    $x \gets 0$\; 
    \If{$x < 10$}{ $x \gets x + 1$\; }
  \captionof{figure}{This is the algorithm}
  \end{algorithm}

This is the end of the document

\end{document}

在此处输入图片描述

答案2

algorithm包中的环境似乎alogrithm2e需要外部 par 模式,并且似乎被实现为/类似于浮点数。浮点数(tablefigure、 ...)不能被捕获在框(\vbox\mbox\parboxminipagevarwidth)内。这就是为什么algorithm环境不适用于我的standalone类、带varwidth选项(段落模式)或不带选项(受限水平模式)或previewvarwidth内的包/环境的原因article

standalone或者preview根本不适合浮动内容。在紧凑的文档中单独使用浮动通常没有多大意义。对于浮动,figure将图形放在内容standalone文档中,然后将其输入到figure主文档的环境内。为了简化此过程,standalone还有一个float选项,它将常见的浮动环境重新定义为非浮动环境,以使它们不兼容。

不幸的是,这两种解决方案都不适用于algorithm。似乎没有nofloat选项或类似选项。尝试将包figure选项algorithm2efloat选项一起使用standalone也不起作用。algorithm2e如果您愿意,可以要求作者添加这样的选项;-)


如果您希望将algorithm环境作为单独的文档,则可以使用article类而不是standalone传递裁剪功能。然后只需standalone在主文件中使用包来输入该文件即可。

% somealgo.tex
\documentclass{article}
\usepackage{algorithm2e}
\begin{document}
\begin{algorithm}
$x \gets 0$\;
\If{$x < 10$}{
  $x \gets x + 1$\;
}
\end{algorithm}
\end{document}

% main.tex
\documentclass{article}
\usepackage{standalone}
\usepackage{algorithm2e}

\begin{document}

Text Text Text Text Text Text Text Text 

\input{somealgo}

Text Text Text Text Text Text Text 

\end{document}

答案3

该类与的环境standalone不兼容;它甚至不能与的选项一起使用,这有助于在文档内容需要文本宽度的情况下。algorithmalgorithm2evarwidthstandalone

根据使用该standalone包的最初原因,有几种可能性。

  • 如果您只想构建文档,则\input主文件中的裸算法。无需额外的软件包,这是纯 (La)TeX。
    % main.tex
    \documentclass{article}
    \usepackage{algoritm2e}
    \begin{document}
    This is my algorithm:
    \input{myalgorithm}
    \end{document}
    
    % myalgorithm.tex
    \begin{algorithm}
    ...
    \end{algorithm}
  • 如果您希望能够独立排版算法,例如在编写和测试代码时,您可以使用该subfiles包。结构如下所示。您可以在 main.tex 以及 myalgorithm.tex 上运行 LaTeX,具体取决于您是要排版整个文档还是仅排版算法。
    % main.tex
    \documentclass{article}
    \usepackage{algorithm2e}
    \usepackage{subfiles}
    \begin{document}
    This is my algorithm:
    \subfile{myalgorithm}
    \end{document}
    
    % myalgorithm.tex
    \documentclass[main]{subfiles}% The pseudo-option main refers to main.tex; change it e.g. to thesis if the main file is named thesis.tex
    \begin{document}
    \begin{algorithm}
    ...
    \end{algorithm}
    \end{document}
  • 如果您需要 独有的功能standalone,则可能必须切换到另一个算法包,这意味着您必须重写算法。以下algpseudocode(来自algorithmicx包) 与standaloneplusvarwidth选项的组合有效。请注意,使用该algorithm包添加标题将再次破坏代码。
    % myalgorithm.tex
    \documentclass[varwidth]{standalone}
    \usepackage{algpseudocode}
    \begin{document}
    \begin{algorithmic}
    \State $x \gets 0$
    \If{$x < 10$}
    \State $x \gets x + 1$
    \EndIf
    \end{algorithmic}
    \end{document}

相关内容