偶尔会有一些“特殊页面”,我不希望在其上显示任何图形或表格(例如,封面)。
通常我解决这个问题的方法是简单地将所有浮点数放在源代码中足够晚的位置,这样它们就不会出现在特殊页面上。
有没有更干净的解决方案?我可以轻松实现\nofloatsonthispage
宏吗?
答案1
下面是一些禁用和启用浮动放置的“粗体”代码:
\DeferAllFloats
从那时起停止所有尚未放置的浮点数(即已经推迟或稍后遇到的浮点数)。
\AllowFloats
允许浮动放置。
在双列文档中,这些命令作用于列级别,例如,如果\AllowFloats
放置在页面第一列的某个位置,第二列可能会再次接收浮动元素。类似地,为了确保下一页不会获得任何浮动元素,可能需要将其放置\DeferAllFloats
在上一页末尾附近的某个位置(以防止放置任何已等待设置的浮动元素)。
所以也许并不完美,但是......(我可能可以用更少的设置来解决,但这需要对依赖关系有更多的思考)。
\documentclass[twocolumn]{article}
\makeatletter
\newif\if@nofloats
\def\AllowFloats{\global\let\if@nofloats\iffalse}
\def\DeferAllFloats{\global\let\if@nofloats\iftrue\@floatplacement}
\AllowFloats
\AtEndDocument\AllowFloats
\def\@floatplacement{%
\if@nofloats
\global\@topnum\z@
% Textpage bit, global:
\global\@toproom \z@
\global\@botnum \z@
\global\@botroom \z@
\global\@colnum \z@
% Floatpage bit, local:
\@fpmin 1.1\@colht
\else
\global\@topnum\c@topnumber
% Textpage bit, global:
\global\@toproom \topfraction\@colht
\global\@botnum \c@bottomnumber
\global\@botroom \bottomfraction\@colht
\global\@colnum \c@totalnumber
% Floatpage bit, local:
\@fpmin \floatpagefraction\@colht
\fi
}
\def \@dblfloatplacement {%
\if@nofloats
\global \@dbltopnum \z@
\global \@dbltoproom \z@
\@textmin \@colht
\@fpmin 1.1\textheight
\else
\global \@dbltopnum \c@dbltopnumber
\global \@dbltoproom \dbltopfraction\@colht
\@textmin \@colht
\advance \@textmin -\@dbltoproom
\@fpmin \dblfloatpagefraction\textheight
\@fptop \@dblfptop
\@fpsep \@dblfpsep
\@fpbot \@dblfpbot
\fi
}
\makeatother
%%% remainder is for testing
\usepackage{lipsum}
\newcommand\Afloat[1]{\begin{figure}A float\hrulefill\caption{#1}\end{figure}}
\newcommand\Wfloat[1]{\begin{figure*}A wide float\hrulefill\caption{#1}\end{figure*}}
\begin{document}
\lipsum[1]
\Afloat{A}
\Wfloat{B}
\DeferAllFloats
\Afloat{C}
\lipsum[2-21]
XXXX --- here we allow floats again ---
\AllowFloats
\lipsum[3-10]
\end{document}