From: girou@circe.fr (Denis Girou)
Newsgroups: comp.text.tex
Subject: Re: Wrapping text around figures
Date: 8 Oct 92 10:13:28 GMT
Reply-To: girou@circe.fr (Denis Girou)
Organization: circe


  In article <1992Oct2.130912.8624@jarvis.csri.toronto.edu>,
ghali@csri.toronto.edu (Sherif Ghali) writes:
> +------------------------------+
> |******************************|
> |******************************|
> |******************************|
> |*****************+------------+
> |*****************|            |
> |*****************|            |
> |*****************|            |
> |***** text ******|            |
> |*****************|  figure    |
> |*****************|            |
> |*****************|            |
> |*****************|            |
> |*****************|            |
> |*****************|            |
> |******************************|
> |******************************|
> |******************************|
> +------------------------------+
> 
> 
> Could someone suggest a way of doing that?
> 
> Thanks,
> Sherif Ghali

  It's easy to do with the window.sty

  Here, I enclose a simple example with a PostScript figure that I compose 
using the example file distributed with the style, the window style itself 
and the original example.

  Enjoy !

\documentstyle[window,psfig]{article}

\begin{document}
This is a test of the new technique for building
windows. Use them to display pictures in text.

\windowbox[toplines: 2][inwindow: {%
{\fbox{\psfig{figure=../bancs-essais/graphiques-resultats/postscript/gob
in.ps,height=3cm,width=4cm}}}%
 }][ratio: 2 1]%
London. Mich\ae{}lmas Term lately over, and the Lord Chancellor sitting
in Lincoln's Inn Hall. Implacable November weather. As much mud in the
streets, as if the waters had but newly retired from the face of the
earth, and it would not be wonderful to meet a Megalosaurus, forty feet
long or so, waddling like an elephantine lizard up Holborn Hill. Smoke
lowering down from chimney-pots, making a soft black drizzle, with
flakes of soot in it as big as full-grown snow-flakes --- gone into
mourning, one might imagine, for the death of the sun. Dogs,
indistinguishable in mire. Horses, scarcely better; splashed to their
very blinkers. Foot passengers, jostling one another's umbrellas, in a
general infection of ill-temper, and losing their foot-hold at
street-corners, where tens of thousands of other foot passengers habe
been slipping and sliding since the day broke (if this day ever broke),
adding new deposits to the crust upon crust of mud, sticking at those
points tenaciously to the pavement, and accumulating at compound
interest.

\end{document}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%
%                                                                       
      %
%                This is WINDOW.STY               (Elmar Schal\"uck Apr
1991)  %
%                                                                       
      %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%
\message{This is WINDOW.STY   by Elmar Schalueck    April 1991}
%   These routines and macros are mainly due to Alan Hoenig
%   I myself found them in a lovely book named
%   \TeX: applications, uses, methods (Malcolm Clark, ed.),
%   Horwood, New York 1990
%   Please report errors, suggestions for better versions, etc. to
%   elmar@uni-paderborn.de
%
\makeatletter
\newdimen\@totalheight                   % the height of the included box
\newdimen\@wordskip                      % interspace between box and text
\newcount\@numberlines                   % lines corresponding to boxheight
\newdimen\@tempdim                       % vskip box to have middle height
\def\z@pt{0pt}
\newdimen\point@strut                    % help dimension
\newdimen\strut@depth \newdimen\strut@height        % approximate values
\newcount\n@                             % count value for parshaping
\newcount\old@vbadness                   % backup value
\newcount\@top                           % number of full lines
\newcount\@window                        % number of window lines
\newdimen\shave@height                   % backup values
\newdimen\old@split@top@skip \newdimen\old@prevdepth
\newdimen\old@lineskip
\newdimen\@side                          % length of windowtext left and right
\newdimen\left@side \newdimen\right@side % text left and right
\newcount\ratio@left                     % ratio of text left versus right
\newcount\ratio@right
\newcount\ratio@sum
\newcount\ratio@zero                     % instead of a \newif
\newtoks\parshape@spec                   % build the wanted parshape
\newbox\window@parbox                    % the textbox with empty window
\newbox\left@box                         % help box to reassemble line
\newbox\right@box
\newbox\build@par                        % text before reassembling
\newbox\in@window                        % what to put in the window
%
\def\windowbox[toplines: #1][inwindow: #2][ratio: #3 #4]#5\par{%
%  #1 number of lines before the window starts
%  #2 what will be displayed in the window
%  #3 how many parts of the text will be on the left side of the window
%  #4 how many parts of the text will be on the right side of the window
%  #5 the actual text of the window
\old@vbadness=\vbadness \vbadness=10000
\@top=#1
\setbox\in@window\hbox{#2}
\ratio@left=#3
\ratio@right=#4
\ratio@zero=0              % ratio@zero = 0 iff text appears on
                           % both sides of  the window and cutting
                           % and reassembling must be done.
\ifnum\ratio@left=0\ratio@zero=1\fi
\ifnum\ratio@right=0\ratio@zero=1\fi
\calculate@dimens          % collect all values that are necessary
\create@parshapespec       % create the parshape of the text
\setbox\build@par=\vbox{\parshape=\n@ \the\parshape@spec \strut#5}
                           % build the paragraph
\ifnum\ratio@zero=1
\let\window@parbox=\build@par   % the paragraph is ok
\else\open@window\fi            % cut and reassemble
\vskip0.5\@tempdim
\vskip\@top\baselineskip        % place the box inside the window
\noindent
\ifnum\ratio@left=0
\else\hskip\left@side
\hskip\@wordskip
\fi     
\box\in@window                  % jump back to the normal beginning of
\par\nobreak                    % the paragraph. Avoid page breaks
\vskip-0.5\@tempdim
\vskip-\@totalheight
\vskip-\@top\baselineskip
\box\window@parbox              % place the actual text
\vbadness=\old@vbadness                  % restore old settings
\splittopskip=\old@split@top@skip
}
%
\def\open@window{%                      % cut and paste
\old@split@top@skip=\splittopskip \global\splittopskip=0pt
\ifnum\@top=0
\old@prevdepth=\strut@depth\else
\shave@height=\@top\baselineskip
\advance\shave@height by-\strut@depth
\global\setbox\window@parbox=\vsplit\build@par to \shave@height
\old@prevdepth=\dp\window@parbox
\fi
%%          \window@parbox contains the top part of the paragraph
\count10=\@numberlines             % for lines := 1 to @numberlines do
\shave@height=\strut@height
\loop \setbox\left@box=\vsplit\build@par to\shave@height
\setbox\right@box=\vsplit\build@par to\shave@height
%% the left and the right boxes of one line are built
\advance\count10 by-1 \make@line[\left@box,\right@box]
%% now they are reassembled
\ifnum\@top=0                 % if in first line without toplines
\ifnum\count10=\@numberlines
\global\setbox\window@parbox\vbox{\box0}    % initiate window@parbox
\else\addline@to@windowpar                  % else addlines
\fi
\else\addline@to@windowpar
\fi
\ifnum\count10>0 \repeat    % end of window-loop
%%      \window@parbox has the window part too
%%      paste the bottom
\old@lineskip=\lineskip
\global\setbox\window@parbox=\vbox{\prevdepth=\old@prevdepth%
\lineskip=1.5pt                       % This value doesn't seem to fit
                                      % for big fontsizes
\unvbox\window@parbox\box\build@par}
\lineskip=\old@lineskip
}
%
\def\calculate@dimens{%
\setbox0\hbox{[}         % to calculate strut@height and strut@depth
\point@strut=\baselineskip
\advance\point@strut by -\ht0
\advance\point@strut by -\dp0
\divide\point@strut by 2
\global\strut@height=\ht0         % just approximate values
\global\strut@depth=\dp0
\global\advance\strut@height by\point@strut
\global\advance\strut@depth by\point@strut
\global\setbox\strutbox=\hbox{\vrule height\strut@height
depth\strut@depth width0pt}                    % adjust the \strutbox
\global\@totalheight=\ht\in@window
\global\advance\@totalheight by\dp\in@window   % the total height of the
                                               % included window
\global\@numberlines=\@totalheight
\global\divide\@numberlines by\baselineskip
\global\@tempdim=\baselineskip
\global\multiply\@tempdim by-\@numberlines
\global\advance\@tempdim by\@totalheight
\ifdim\@tempdim>0.3pt%
 \global\advance\@numberlines by 1
 \global\@tempdim=\baselineskip
 \global\multiply\@tempdim by\@numberlines
 \global\advance\@tempdim by-\@totalheight
\fi                                            % number of lines for the window
                                               % and additional vskip
for window
\global\@wordskip=\fontdimen2\font
\global\@window=\@numberlines
\global\@side=\hsize
\global\advance\@side by-\wd\in@window
\global\advance\@side by-\@wordskip
\ifnum\ratio@zero=0\global\advance\@side by-\@wordskip\fi
\ratio@sum=\ratio@left
\advance\ratio@sum by\ratio@right
\global\left@side=\@side
\global\multiply\left@side by\ratio@left
\global\divide\left@side by\ratio@sum
\global\right@side=\@side
\global\multiply\right@side by\ratio@right
\global\divide\right@side by\ratio@sum         % left side and right side
                                               % according to the chosen ratio
}
%
\def\create@parshapespec{%
\global\n@=\@top                               % number of lines for parshape
\global\advance\n@ by\@window
\ifnum\ratio@zero=0\global\advance\n@ by\@window\fi
\global\advance\n@ by1
\global\parshape@spec={}                       % initialize parshape@spec
\count10=\@top                                 % for i := 1 to @top do
\ifnum\@top>0{                                 % add complete lines to shape
\loop \global\parshape@spec=\expandafter{\the\parshape@spec \z@pt\hsize}
\advance\count10 by-1 \ifnum\count10>0 \repeat
}\fi
\count10=\@window                              % for i := 1 to @window do
\loop                                          % add two shorter lines
\ifnum\ratio@zero=0         % both ratio values \neq 0
\global\parshape@spec=\expandafter{\the\parshape@spec
\z@pt\left@side \z@pt\right@side}
\else                       % one ratio value is zero
\ifnum\ratio@left=0
\@side=\hsize\advance\@side by-\right@side     % window at the left side
\global\parshape@spec=\expandafter{\the\parshape@spec
\@side\right@side}\fi
\ifnum\ratio@right=0\global\parshape@spec=\expandafter{\the\parshape@spec
\z@pt\left@side}\fi                            % window at the right side
\fi
\advance\count10 by-1 \ifnum\count10>0 \repeat % end of loop
\global\parshape@spec=\expandafter{\the\parshape@spec \z@pt\hsize}
}                                              % add full line to shape
%
%   unwrap the vertical glue and remove the final glue
\def\unwrap#1#2{\unvbox#1 \setbox#1=\lastbox
\setbox#1=\hbox to#2{\strut\unhbox#1 \unskip}%
}
%
%  make a line of two halfs
\def\make@line[#1,#2]{%
\unwrap\left@box\left@side \unwrap\right@box\right@side
\setbox0=\hbox to\hsize{\box#1\hss\box#2}%
}
%
\def\addline@to@windowpar{%       add the reassembled lines to the output
\global\setbox\window@parbox=\vbox{\prevdepth=\old@prevdepth
\unvbox\window@parbox \box0}%
\old@prevdepth=\dp\window@parbox
}
%
%
\makeatother            % disable use of @ as a letter
%%


----- END OF WINDOW.STY -----


  The original example :


\documentstyle[window]{article}
\begin{document}
This is a test of the new technique for building
windows. Use them to display pictures in text.

\windowbox[toplines: 2][inwindow: {\fbox{\Huge\shortstack{H\\e\\l\\l\\o}}}]%
[ratio: 2 1]%
London. Mich\ae{}lmas Term lately over, and the Lord Chancellor sitting
in Lincoln's Inn Hall. Implacable November weather. As much mud in the
streets, as if the waters had but newly retired from the face of the
earth, and it would not be wonderful to meet a Megalosaurus, forty feet
long or so, waddling like an elephantine lizard up Holborn Hill. Smoke
lowering down from chimney-pots, making a soft black drizzle, with
flakes of soot in it as big as full-grown snow-flakes --- gone into
mourning, one might imagine, for the death of the sun. Dogs,
indistinguishable in mire. Horses, scarcely better; splashed to their
very blinkers. Foot passengers, jostling one another's umbrellas, in a
general infection of ill-temper, and losing their foot-hold at
street-corners, where tens of thousands of other foot passengers habe
been slipping and sliding since the day broke (if this day ever broke),
adding new deposits to the crust upon crust of mud, sticking at those
points tenaciously to the pavement, and accumulating at compound
interest.

\parskip1ex
\large
\windowbox[toplines: 0][inwindow: {\fbox{\Huge\shortstack{H\\e\\l\\l\\o}}}]%
[ratio: 0 1]%
London. Mich\ae{}lmas Term lately over, and the Lord Chancellor sitting
in Lincoln's Inn Hall. Implacable November weather. As much mud in the
streets, as if the waters had but newly retired from the face of the
earth, and it would not be wonderful to meet a Megalosaurus, forty feet
long or so, waddling like an elephantine lizard up Holborn Hill. Smoke
lowering down from chimney-pots, making a soft black drizzle, with
flakes of soot in it as big as full-grown snow-flakes --- gone into
mourning, one might imagine, for the death of the sun. Dogs,
indistinguishable in mire. Horses, scarcely better; splashed to their
very blinkers. Foot passengers, jostling one another's umbrellas, in a
general infection of ill-temper, and losing their foot-hold at
street-corners, where tens of thousands of other foot passengers habe
been slipping and sliding since the day broke (if this day ever broke),
adding new deposits to the crust upon crust of mud, sticking at those
points tenaciously to the pavement, and accumulating at compound
interest.
\par

\small
\windowbox[toplines: 3][inwindow: {\fbox{\huge Hello}}]%
[ratio: 1 0]%
London. Mich\ae{}lmas Term lately over, and the Lord Chancellor sitting
in Lincoln's Inn Hall. Implacable November weather. As much mud in the
streets, as if the waters had but newly retired from the face of the
earth, and it would not be wonderful to meet a Megalosaurus, forty feet
long or so, waddling like an elephantine lizard up Holborn Hill. Smoke
lowering down from chimney-pots, making a soft black drizzle, with
flakes of soot in it as big as full-grown snow-flakes --- gone into
mourning, one might imagine, for the death of the sun. Dogs,
indistinguishable in mire. Horses, scarcely better; splashed to their
very blinkers. Foot passengers, jostling one another's umbrellas, in a
general infection of ill-temper, and losing their foot-hold at
street-corners, where tens of thousands of other foot passengers habe
been slipping and sliding since the day broke (if this day ever broke),
adding new deposits to the crust upon crust of mud, sticking at those
points tenaciously to the pavement, and accumulating at compound
interest.
\par

I hope these three examples make clear, what possibilties you have and
how these routines are used.
\end{document}


------------------------------------------------------
Denis Girou (C.N.R.S./C.I.R.C.E.)                    |
Batiment 506 - B.P. 167 - 91403 Orsay Cedex - France |
E-mail : girou@circe.fr - Tel.  : 33. 1. 69.82.41.52 |
------------------------------------------------------
Newsgroups: comp.text.tex