% %Date: Tue, 25 Oct 88 14:11:06 +0100 %From: Joost Zalmstra %Subject: Re:Page Make-up Challenge % %Maybe the following set of macros can contribute to the solution of %the problem posed by David Rogers in TeXhax #86. It implements a floating %insertion with the following properties: % - Every insertion must be put in a \vbox. Customised macros can then % be used to place the white space for the figure and the figure caption % in this box. % - The order in which these \vbox-es are inserted is maintained. % - No more than two boxes are placed on one page: the first on the top % and the second on the bottom of the page. % %The proposed macro \figplace should create a \vbox with the correct layout %of the figure and then call \addfigure to put it in the insertionlist: % %\def\figplace#1#2#3#4{setbox0=\vbox{% %% here call macros to place figure and caption %} %\addfigure0} % %Note that the space separating the figure from the text should not %be included in the \vbox. The skipregister \figureskip is used for this %purpose. % %The macros are written in plain TeX, in fact the output routine given %here is an extension of the plain output routine (TeX-book page 364). % %The basic idea is that figures that won't fit on the current page %are kept on a list (the \box \figlist). This list is checked after %a \shipout and if not empty a maximum of two \vboxes is inserted %(using plains \topins) for the next page. As the insertions are \vboxes %it is easy to split the insertion and put one at the top and one at %the bottom of the page. % %Two further refinements should be mentioned here. %1) If the figures on a page take so much room that less than a specified %amount of space (given in dimen register \minpagesize) is left for %the text, this text is shifted through to the next page. %2) By inserting a \vbox with height \vsize (created by \vbox to \vsize..) %a page insert is created. No extra \figureskip will be include in this case. % %I have tested these macros with real input (16 pages with on the first %page the insertion of several figures) and it seems to work on the moment. %However, I'm not a TeX guru and I would expect that these macros can be %improved. One of the problems left is te fact that \addfigures must %be called in horizontal mode ( \vadjust won't work). I would therefore %apreciate comments, both on the macros as they stand and on how this %contributes to the Challenge. % %Joost Zalmstra. % %jjaz%nat.vu.nl@hearn.bitnet \newbox\figlist \newcount\figuresonpage \figuresonpage=0 \newcount\figuresonlist \figuresonlist=0 \newskip\figureskip \figureskip=1.2 pc plus 1 pc \newdimen\pagesize \newdimen\minpagesize \minpagesize=5 pc \newdimen\figuresizeonpage \def\addfigure#1{% add figure in box #1 to the document \ifnum\figuresonpage>1 % allready two figures on this page \addtolist{#1}% % so save for later \else \ifnum\figuresonlist>0 % figlist is not empty \addtolist{#1} % so save for later \else % no figures left over, so try to fit this one \dimen0=\ht#1 \ifdim\dimen0<\vsize% not a pagesize figure \advance\dimen0 by \dp#1 % size of the box \advance\dimen0 by \figureskip % extra space below or above \fi \advance\dimen0 by \pagetotal \ifdim\dimen0>\pagegoal % no space on this page \addtolist{#1} % so save for later \else \advance\dimen0 by \figuresizeonpage \ifdim\dimen0>\dimen\topins % exceding maximum insertion size \addtolist{#1} % so save for later \else \figureinsert{#1} % insert the figure \fi \fi \fi \fi } \def\addtolist#1{% add box #1 to figlist \global\setbox\figlist=\vbox{% \nointerlineskip \box#1 \unvbox\figlist} \global\advance\figuresonlist by 1 } \def\figureinsert#1{% insert figure on this page \ifdim\ht#1<\vsize \insert\topins{\vbox{% \ifnum\figuresonpage=0 \unvbox#1\vskip\figureskip % skip below the figure \else \vskip\figureskip\unvbox#1 % skip above the figure \fi }} \else \pageinsert \unvbox#1 \endinsert \fi \global\advance\figuresonpage by 1 \global\advance\figuresizeonpage by \ht#1 \global\advance\figuresizeonpage by \dp#1 \global\advance\figuresizeonpage by \figureskip } \def\checkfiglist{% see if there is a figure in the list that will % fit on the next page \ifnum\figuresonlist>0 \global\setbox\figlist=\vbox{% \unvbox\figlist \setbox0=\lastbox \global\advance\dimen0\ht0 \ifdim\ht0<\vsize \global\advance\dimen0 by \dp0 \global\advance\dimen0 by \figureskip \fi \ifdim\dimen0>\vsize \vbox{\box0} % no room ; replace the figure \else \ifdim\dimen0>\dimen\topins \vbox{\box0} \else \global\advance\figuresonlist by -1 \fi \fi \global\setbox0=\box0 } \else {\setbox1=\box0 % make box0 void \global\setbox0=\box0} \fi } % Borrowing the macros from plain TeX \catcode`@=11 \output{\myoutput} \def\myoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% \advancepageno \global\figuresonpage=0 \dimen0=0pt \global\figuresizeonpage = 0pt \checkfiglist % check if there is figure waiting and return it in box 0 \ifvoid0 % nothing left \else \figureinsert0% insert this figure \checkfiglist % check for a second figure \ifvoid0\else \figureinsert0 \fi \fi \ifvoid255\else\unvbox255\penalty\outputpenalty\fi % unused page back on list \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} \def\pagecontents{% \ifnum\figuresonpage>0 % check for insertion of figures \unvbox\topins % place the figure(s) on top \ifnum\figuresonpage=2 \setbox0=\lastbox % remove the second figure \fi \setbox1=\lastbox \unvbox1 \fi % Check box 255 \pagesize=\ht255 \advance\pagesize by \dp255 % determine size of box 255 \ifdim\pagesize>\minpagesize \dimen@=\dp255 \unvbox255 % the real page contents \else \message{tekstsize = \the\ht255, \the\dp255} \ifdim\ht255=0pt % box is empty \else \vfil % to small so leave for next page \fi \fi % \ifnum\figuresonpage=2 \box0 % the second figure \fi \ifvoid\footins\else % footnote info is present \vskip\skip\footins \footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} \catcode`@=12 % at signs no longer letters