summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/misc/newinsert.tex
blob: bb37c41c7671aebb694fd431292c047f3e2258ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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