有没有办法确定页面上是否有浮动?

有没有办法确定页面上是否有浮动?

我正在忙着开发一些代码来绘制布局。部分代码覆盖了布局,如下图所示:

enter image description hereenter image description here

图片侧面的黑色箭头表示\topfraction\bottomfraction参数。如果浮点数存在于该位置,则最好只显示它们。是否可以检测浮点数及其位置?

(该软件包的目的是一目了然地显示所有几何参数并绘制网格,请参见细的浅青色线条)。

答案1

在输出例程中(我假设你正在添加覆盖),你可以检查

    \@freelist     : List of empty boxes for placing new floats.
    \@toplist      : List of floats to go at top of current column.
    \@midlist      : List of floats in middle of current column.
    \@botlist      : List of floats to go at bottom of current column.
    \@deferlist    : List of floats to go after current column.
    \@dbltoplist   : List of double-col. floats to go at top of current
                     page.
    \@dbldeferlist : List of double-column floats to go on subsequent
                     pages.

或者你可能更喜欢补丁

%  \begin{macro}{\@flupdates}
% \changes{v1.0f}{1993/12/05}{Command added}
%    This updates everything when a float is placed.
%
%    \begin{macrocode}
%<*2ekernel|autoload>
\def \@flupdates #1#2#3{%
   \global \advance #1\m@ne
   \global \advance \@colnum \m@ne
   \@tempdima -\ht\@currbox
   \advance \@tempdima
     -\ifx #3\@empty \textfloatsep \else \floatsep \fi
   \global \advance #2\@tempdima
   \global \advance \@colroom \@tempdima
   \@cons #3\@currbox
}

这样它除了输出例程内部内容之外,还会更新您的数据结构。


查看fancyhdr。它使用我建议的第一种方法。例如,它在 latex 设置列之前保存\@toplist(在\topfloat),以便在设置标题时仍然定义它。然后\iftopfloat进行一个简单的ifx测试来查看它是否为空。

然而如果是不是如果为空,则它是一个框寄存器(索引)列表,用于保存放在列顶部的浮点数。因此,您可以通过列表的长度判断该区域中有多少浮点数。但是,您无法获得范围,因为在调用标题时,浮点数已被添加,并且浮点框已被清除并回收。

因此,本文档(不加载任何包但使用相关的 fancyhdr 定义)可以测试是否存在任何顶部浮点数,如果存在,则计算列表并报告有多少个浮点数(本文档中为 0、1 和 2),但是当它遍历列表以报告浮点数的大小时,它什么也得不到,因为框已被清除。

\documentclass{article}

\setlength\textheight{20\baselineskip}
\raggedbottom

\makeatletter
\newif\iffootnote
\let\latex@makecol\@makecol
\def\@makecol{\ifvoid\footins\footnotetrue\else\footnotefalse\fi
\let\topfloat\@toplist\let\botfloat\@botlist\latex@makecol}
\def\iftopfloat#1#2{\ifx\topfloat\empty #2\else #1\fi}
\def\ifbotfloat#1#2{\ifx\botfloat\empty #2\else #1\fi}
\def\iffloatpage#1#2{\if@fcolmade #1\else #2\fi}

\def\ps@foo{%
\def\@oddhead{%
T: \iftopfloat{yes
               [{\count@\z@ \def\@elt{\advance\count@\@ne}\topfloat \the\count@}]%
               [{\def\@elt{, \the\ht}\topfloat}]%
}
{no}\hfill}}
\pagestyle{foo}

\makeatother

\def\a{One two three. }
\def\b{Red, Green, Blue. }
\def\c{\a\a\b\b\a\a\a\b\b\b\a}
\def\d{\c\c\par\a\b\c\b\par}

\begin{document}

\d

\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}

\d
\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}
\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}

\d
\end{document}

因此,不要仅仅使用它\let来保存乳胶列表的快照,而要使用\edef保存列表来保存框的高度宽度和深度。然后在页眉中,您可以像以前一样计算列表或将所有高度相加(加上\floatsep除第一个之外的所有高度),然后报告顶部浮动区域的高度。

对其他区域执行同样操作留作练习:-)

\documentclass{article}

\setlength\textheight{20\baselineskip}
\raggedbottom

\makeatletter
\newif\iffootnote
\let\latex@makecol\@makecol
\def\@makecol{\ifvoid\footins\footnotetrue\else\footnotefalse\fi
\def\@elt##1{\noexpand\@elt{\the\ht##1}{\the\dp##1}{\the\wd##1}}%
\edef\topfloat{\@toplist}%
\let\@elt\relax
\let\botfloat\@botlist\latex@makecol}

\def\iftopfloat#1#2{\ifx\topfloat\empty #2\else #1\fi}
\def\ifbotfloat#1#2{\ifx\botfloat\empty #2\else #1\fi}
\def\iffloatpage#1#2{\if@fcolmade #1\else #2\fi}

\def\count@elt#1#2#3{\advance\count@\@ne}
\def\sum@elt#1#2#3{\advance\dimen@\floatsep\advance\dimen@#1\relax}
\def\ps@foo{%
\def\@oddhead{%
T: \iftopfloat{yes
               [{\count@\z@ \let\@elt\count@elt \topfloat \the\count@}]%
               [{\dimen@-\floatsep \let\@elt\sum@elt \topfloat size of top area: \the\dimen@}]%
}
{no}\hfill}}
\pagestyle{foo}

\makeatother

\def\a{One two three. }
\def\b{Red, Green, Blue. }
\def\c{\a\a\b\b\a\a\a\b\b\b\a}
\def\d{\c\c\par\a\b\c\b\par}

\begin{document}

\d

\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}

\d
\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}
\begin{figure}[!t]
\fbox{XXXXXX}
\caption{jjj}
\end{figure}

\d
\end{document}

答案2

根据 Alan Munn 的评论,我尝试了 中的条件fancyhdr。这些条件很有效。有三个条件,\iftopfloat\ifbottomfloat\iffloatpage

要使用 TikZ 有条件地绘制线条,

\iftopfloat{%
\draw [dim,|<->|] (1in+\innermargin-0.3cm, \paperheight-1in-\topmargin-\headheight-\headsep)-- ++(0,-\topfraction\textheight) node[left,text width=1.5cm,text ragged] at ++ (0,0.4\textheight) {top\\ fraction\\ \topfraction}}{};
\draw[dim,|-|] ( (1in+\innermargin+0.3cm,\paperheight-1in-\topmargin-\headheight-\headsep-\topfraction\textheight) -- ++(0,-\textfloatsep);

相关内容