我正在尝试生成一个包含算法的 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
(例如preview
和varwidth
),但未能使其工作。有一个类似的问题(使用 algorithmicx 或 algorithm2e 独立运行),但它相当老旧,没有合适的答案。我已经用 algorithm2e 编写了算法,所以我不想使用其他算法包。我只是需要一个可行的示例。
答案1
算法设置在浮动环境中,而standalone
内容则放在盒子中。这是不兼容的。
但是,如果你给算法提供[H]
选项,它将不再是浮动的,所以你可以使用它。除非你使用capt-of
或caption
包,否则它将不再有可能有标题,但你可能会将标题放在主文档中。
请注意,无法将算法裁剪到其最小水平空间,因为包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-of
或caption
包添加标题。在这种情况下,标题将放在框外。
\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 模式,并且似乎被实现为/类似于浮点数。浮点数(table
、figure
、 ...)不能被捕获在框(\vbox
、\mbox
、\parbox
、minipage
、varwidth
)内。这就是为什么algorithm
环境不适用于我的standalone
类、带varwidth
选项(段落模式)或不带选项(受限水平模式)或preview
类varwidth
内的包/环境的原因article
。
standalone
或者preview
根本不适合浮动内容。在紧凑的文档中单独使用浮动通常没有多大意义。对于浮动,figure
将图形放在内容在standalone
文档中,然后将其输入到figure
主文档的环境内。为了简化此过程,standalone
还有一个float
选项,它将常见的浮动环境重新定义为非浮动环境,以使它们不兼容。
不幸的是,这两种解决方案都不适用于algorithm
。似乎没有nofloat
选项或类似选项。尝试将包figure
选项algorithm2e
与float
选项一起使用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
不兼容;它甚至不能与的选项一起使用,这有助于在文档内容需要文本宽度的情况下。algorithm
algorithm2e
varwidth
standalone
根据使用该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
包) 与standalone
plusvarwidth
选项的组合有效。请注意,使用该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}