summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/misc/newinsert.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/misc/newinsert.tex')
-rw-r--r--macros/plain/contrib/misc/newinsert.tex140
1 files changed, 140 insertions, 0 deletions
diff --git a/macros/plain/contrib/misc/newinsert.tex b/macros/plain/contrib/misc/newinsert.tex
new file mode 100644
index 0000000000..bb37c41c76
--- /dev/null
+++ b/macros/plain/contrib/misc/newinsert.tex
@@ -0,0 +1,140 @@
+
+
+%%% ====================================================================
+%%% @TeX-file{
+%%% author = "Walter D. Neumann",
+%%% version = "1.2",
+%%% date = "22 July 1992",
+%%% time = "15:57:20 EDT",
+%%% filename = "newinsert.tex",
+%%% address = "Department of Mathematics
+%%% Ohio State University
+%%% Columbus, OH 43201
+%%% USA",
+%%% email = "neumann@mps.ohio-state.edu (Internet)",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "plain TeX, AMS-TeX, inserts, figures",
+%%% supported = "yes",
+%%% abstract = "Bug fixes to plain TeX macros \midinsert and
+%%% \topinsert",
+%%% }
+%%% ====================================================================
+
+% Include with "\input newinsert.tex" to fix following problems
+% with plain TeX's handling of \midinsert and \topinsert:
+%
+% 1. An insert that falls at the top of the page is too high: its
+% top is at top-of-page rather than top-of-ink.
+% 2. Plain uses \bigskip for space around inserts and assumes \bigskip
+% is 12pt plus stretch, so \midinsert misbehaves if \bigskipamount
+% is changed. This space should be an independent quantity.
+% 3. Consecutive midinserts that did not float are spaced twice
+% as far apart as consecutive topinserts or floated midinserts.
+% 4. Midinserts can get out of order (see Exercise 15.5 of TeXbook).
+% 5. A midinsert can incorrectly convert to a topinsert if TeX is
+% reading ahead (see top of page 116 of TeXbook).
+% 6. \removelastskip fails after a floated insert. This is relevant for
+% an insertion before any construction (such as a proclamation in
+% plain TeX) that does an explicit or implicit \removelastskip.
+% 7. The routine to split an insertion in the program TeX fails if
+% the insertion would fit on the current page after subtracting
+% shrink. To avoid this, INSERTIONS SHOULD NOT CONTAIN SHRINK.
+%
+% Remaining problem: With the default values of 10pt and 12pt for
+% \topskip and \baselineskip, TeX puts 2pt less space between a
+% topinsert or floated midinsert and following text than between a
+% middle insertion and following text. To avoid this without rewriting
+% the plain output routine use:
+%
+% \topskip=\baselineskip
+%
+% PARAMETERS:
+% Plain.tex puts \bigskipamount of space before and after inserts. As
+% described above, this should be an independent parameter with no shrink.
+% We provide \insertskipamount for this purpose (default 6pt plus 2pt;
+% this makes \insertskip behave like an unshrinkable \medskip).
+% In addition, \inserthardskipamount of glue is added at the top of EVERY
+% insert; it remains even at top of page (default 6pt; it should be at
+% least \topskipamount-(text height)).
+% These defaults give good balance for figure insertions of the form:
+% \midinsert
+% [Commands to include a graphics file]
+% \insertskip \centerline{Figure Title}
+% \endinsert.
+% Note use of \insertskip instead of \medskip to avoid shrink.
+%
+\chardef\newinsCatAt\the\catcode `\@
+\catcode `\@=11
+%
+%%%%%%%%%%%% Corrected insert macros for plain.tex %%%%%%%%%%%%%%%%%
+%
+% New skipamounts:
+%
+\newskip\insertskipamount\newskip\inserthardskipamount
+\insertskipamount 6pt plus2pt % Redefine as desired, but with no
+\inserthardskipamount 6pt % shrink (see above).
+\def\insertskip{\vskip\insertskipamount}
+%
+% Save and restore \lastskip:
+%
+\newskip\LastSkip
+\def\SaveLastSkip{\LastSkip\lastskip}
+\def\RestoreLastSkip{\nobreak\vskip-\LastSkip\vskip\LastSkip}
+%
+% Larry Siebenmann's test for split topinserts:
+%
+\newcount\SplitTest% will be set to -1 if a topinsert has split
+\def\SetSplitTest{\SplitTest\insertpenalties
+ \insert\topins{\floatingpenalty1}%
+ \advance\SplitTest-\insertpenalties}
+%
+% From here on we modify definitions in plain.tex.
+%
+% Redefine \midinsert to convert to \topinsert if a topinsert has been
+% split, to prevent midinserts getting out of order (cf. TeXbook Exercise
+% 15.5). As in plain.tex, a \midinsert still converts to a \topinsert
+% (which then splits) if the insert is too big for current page.
+% Was: \def\midinsert{\@midtrue\@ins}
+\def\midinsert{\par
+ \SaveLastSkip\penalty-150\SetSplitTest\RestoreLastSkip
+ \ifnum\SplitTest=-1
+ \@midfalse\else\@midtrue\fi\@ins}
+% Redefine \@ins to add \inserthardskipamount of glue above.
+% Was: \def\@ins{\par\begingroup\setbox\z@\vbox\bgroup}
+\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup%
+ \vglue\inserthardskipamount}
+% Changes to \endinsert of plain.tex 3.0:
+% - Use \insertskipamount instead of \bigskipamount throughout.
+% - Use larger of previous skip and insertskip before middle insert.
+% - Add \nointerlineskip to avoid unwanted extra 1pt skip.
+% - Save and restore lastskip when an insert floats.
+\def\endinsert{\egroup % finish the \vbox
+ \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@
+ \advance\dimen@\insertskipamount% was 12pt (wn)
+ \advance\dimen@\pagetotal\advance\dimen@-\pageshrink
+ \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+% Next 3 lines replace: \if@mid \bigskip\box\z@\bigbreak (wn)
+ \if@mid%
+ \ifdim\lastskip<\insertskipamount\removelastskip\insertskip\fi
+ \nointerlineskip\box\z@\penalty-200\insertskip
+ \else%
+ \SaveLastSkip% added (wn)
+ \insert\topins{\penalty100 % floating insertion
+ \splittopskip\z@skip
+ \splitmaxdepth\maxdimen \floatingpenalty\z@
+ \ifp@ge \dimen@\dp\z@
+ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+ \else \box\z@\nobreak\insertskip\fi}% was \bigskip\fi (wn)
+ \RestoreLastSkip% added (wn)
+ \fi\endgroup}
+%%%%%%%%%%%%%%%%%% Done correcting insert macros %%%%%%%%%%%%%%%%%%%
+%
+\catcode `\@=\newinsCatAt
+\endinput
+%% end newinsert.tex
+%% Revision history:
+%% Version 1.2, 21 July 1992: midinserts still occasionally converted
+%% wrongly to topinsert if Tex is scanning ahead. Added \penalty-150
+%% to fix this.
+% Changed \medskipamount to 6pt plus2pt to avoid shrink in inserts.
+%% Version 1.1, 02 April 1990: used L.Siebenmann's split test