summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/window
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex209/contrib/window
Initial commit
Diffstat (limited to 'macros/latex209/contrib/window')
-rw-r--r--macros/latex209/contrib/window/window.sty206
-rw-r--r--macros/latex209/contrib/window/window.tex70
2 files changed, 276 insertions, 0 deletions
diff --git a/macros/latex209/contrib/window/window.sty b/macros/latex209/contrib/window/window.sty
new file mode 100644
index 0000000000..43b201b689
--- /dev/null
+++ b/macros/latex209/contrib/window/window.sty
@@ -0,0 +1,206 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% 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
+%
+\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
+}
+%
+%
+
diff --git a/macros/latex209/contrib/window/window.tex b/macros/latex209/contrib/window/window.tex
new file mode 100644
index 0000000000..b19069f73f
--- /dev/null
+++ b/macros/latex209/contrib/window/window.tex
@@ -0,0 +1,70 @@
+\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}