我正在忙着开发一些代码来绘制布局。部分代码覆盖了布局,如下图所示:
图片侧面的黑色箭头表示\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);