我正在尝试编写一个自定义环境来设计算法,并让 LaTeX 将它们定位为浮点数。
现在我有这个:
\usepackage{newfloat}
\DeclareFloatingEnvironment[fileext=algf,placement={!tbp},name=Algo]{myfloat}
\usepackage{algpseudocode}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcounter{cnt:alg}
\newenvironment{myalgo}[3][!tbp]{
%\noindent
%\begin{minipage}{\textwidth}
%\vbox\bgroup
\begin{myfloat}[#1]
\begin{center}
\hrulefill\\\vspace{3pt}
\refstepcounter{cnt:alg}\label{#2}
\textbf{Algorithm \ref{#2}:} #3\\
\vspace{-2pt}\hrulefill
\end{center}
}{
\begin{center}
\vspace{-5pt}\hrulefill
\end{center}
\end{myfloat}
%\egroup
%\end{minipage}
}
各种注释行代表我尝试过的不同方法。其中,vbox
是效果最好的方法,但其行为不像float
。myfloat
乍一看,使用 似乎有效,但如果算法足够长,它就会开始表现不稳定(至少从我的角度来看)。大多数时候,算法最终在页面中完全孤立,即使文本可以轻松地与它们并排放置。它们似乎也大多忽略了选项htbp
(或者更有可能的是,它们没有被忽略,但没有做我期望它们做的事情)。
我是否对newfloat
环境做了一些不好的事情?
接下来是完整的 MWE。该算法最终出现在第二页。如果缩短,它将正确地适合文本。
\documentclass[final]{article}
\usepackage{lipsum}
\usepackage{newfloat}
\DeclareFloatingEnvironment[fileext=algf,placement={!tbp},name=Algo]{myfloat}
\usepackage{algpseudocode}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcounter{cnt:alg}
\newenvironment{myalgo}[3][!tbp]{
%\noindent
%\begin{minipage}{\textwidth}
%\vbox\bgroup
\begin{myfloat}[#1]
\begin{center}
\hrulefill\\\vspace{3pt}
\refstepcounter{cnt:alg}\label{#2}
\textbf{Algorithm \ref{#2}:} #3\\
\vspace{-2pt}\hrulefill
\end{center}
}{
\begin{center}
\vspace{-5pt}\hrulefill
\end{center}
\end{myfloat}
%\egroup
%\end{minipage}
}
%----------------------------------------------------------------------------------------
\begin{document}
\lipsum[1-4]
\begin{myalgo}{alg}{Algorithm}
\begin{algorithmic}[1]
\Require{Inputs}
\Ensure{Outputs}
\While While
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\EndWhile EndWhile
\end{algorithmic}
\end{myalgo}
\lipsum[1-5]
\end{document}
答案1
浮动元素不适合第 1 页,但大于一半,\textheight
因此\floatpagefraction
在开始第 (3) 页之前,它会创建一个仅包含此浮动元素的浮动页面。
您可以使用[ht]
(或仅使用[t]
),这样浮动页面就不会被视为该浮动页面,或者您可以使用
\usepackage{fewerfloatpages}
这会修改放置算法,因此在这种情况下它将尝试顶部浮动而不是浮动页面。
避免!
在默认位置。
\documentclass[final]{article}
\usepackage{lipsum}
\usepackage{newfloat}
\usepackage{fewerfloatpages}
\DeclareFloatingEnvironment[fileext=algf,placement={htbp},name=Algo]{myfloat}
\usepackage{algpseudocode}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcounter{cnt:alg}
\newenvironment{myalgo}[3][htbp]{
%\noindent
%\begin{minipage}{\textwidth}
%\vbox\bgroup
\begin{myfloat}[#1]
\begin{center}
\hrulefill\\\vspace{3pt}
\refstepcounter{cnt:alg}\label{#2}
\textbf{Algorithm \ref{#2}:} #3\\
\vspace{-2pt}\hrulefill
\end{center}
}{
\begin{center}
\vspace{-5pt}\hrulefill
\end{center}
\end{myfloat}
%\egroup
%\end{minipage}
}
%----------------------------------------------------------------------------------------
\begin{document}
\lipsum[1-4]
\begin{myalgo}{alg}{Algorithm}
\begin{algorithmic}[1]
\Require{Inputs}
\Ensure{Outputs}
\While While
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\State State
\EndWhile EndWhile
\end{algorithmic}
\end{myalgo}
\lipsum[1-5]
\end{document}
答案2
您应该修改一些浮点参数,例如\topfraction
和。\bottomfraction
floatpagefraction
\renewcommand{\floatpagefraction}{0.7}
在后面添加这一行\documentclass[final]{article}
,你就会发现它浮动了。
另外,应该使用\arabic{cnt:alg}
而不是\ref{#2}
。这样,只需要一次编译就可以正确显示序列号。