summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/placeins-plain
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/plain/placeins-plain')
-rw-r--r--Master/texmf-dist/tex/plain/placeins-plain/placeins.tex137
1 files changed, 137 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/plain/placeins-plain/placeins.tex b/Master/texmf-dist/tex/plain/placeins-plain/placeins.tex
new file mode 100644
index 00000000000..11ed486e7b9
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/placeins-plain/placeins.tex
@@ -0,0 +1,137 @@
+% P L A C E I N S . T E X ver 2.0 Mar 3, 1995
+%
+% Insertions that keep their place.
+%
+% Copyright 1995 Donald Arseneau <asnd@triumf.ca>
+% These macros may be freely used, transmitted, reproduced, or modified
+% provided that this notice is left intact.
+%
+% This TeX file provides various mechanisms (for plain TeX and close
+% relatives) to let insertions (footnotes, topins, pageins, etc.) float
+% within their appropriate section, but to prevent them from intruding
+% into the following section, even when sections do not normally begin
+% a new page. (If your sections normally begin a new page, just use
+% \supereject to flush out insertions.)
+%
+% Different combinations of insertions can be controlled with different
+% commands:
+%
+% \par\penalty-20029
+% If there are any insertions that will not fit on the current page,
+% a \supereject is performed and the following text will continue at
+% the top of a page after all insertions. If all insertions do fit
+% on the current page, then the following text will continue
+% immediately on this page.
+% \par\penalty-20030
+% Like above, except that if there are any footnotes at all on the
+% current page, the section must begin on the next page. (This is so
+% no footnote text from section 1 will appear beneath the beginning
+% of section 2.)
+% \par\penalty-10029
+% If any insertions cannot fit on the current page, eject them, and
+% then allow the following section to begin immediately on the same
+% page as the last insert. If all insertions do fit on the current
+% page, then the following text will continue immediately on this
+% page.
+% \barrier{\eject}{\topins}
+% If there are any pageinserts or topinserts that do not fit on the
+% current page, eject them, and then allow the following section to
+% begin immediately on the same page as the last insert. Split
+% footnotes or other insertions are allowed to intrude into the next
+% section.
+% \barrier{\supereject}{\topins}
+% Like the \barrier command above, but if any inserts are ejected
+% the following section will begin at the top of a new page (like
+% \supereject).
+% \barrier{...}{\footins}
+% *** NOT ALLOWED *** You will get spurious space and footnote-rules
+% at the bottom of pages!
+% \barrier{...}{\margins}
+% If you define other insertion classes, such as marginal notes, you
+% can use \barrier for them too. But only if \skip\margins=0pt.
+% You must also add any new insertion classes to the definition of
+% \placerestoreoutput
+%
+% How to use: First, \input this file (of course!). Then, at the beginning
+% of a new section, or at any boundary that insertions should not cross, put
+% one of the commands listed above. Presumably, you will actually put these
+% commands at the start of your own \section or \startsection macro; that is
+% why they are non mnemonic!
+%
+% There is a slight chance that a footnote may be separated from its reference
+% in the text after \penalty-xxxxx when there are no split insertions. (LaTeX
+% has the same possibility at every float!)
+
+\chardef\noplaceoutput\catcode`\@
+\catcode`\@=11
+
+\edef\zero@skip{\the\z@skip}
+
+\def\barrier#1#2{\par\begingroup
+ \ifdim\skip#2>\z@{\newlinechar10\errhelp{\barrier#2may produce some spurious
+ extra material on the page, ^^J but I will try anyway.}\errmessage{Bad use
+ of \string\barrier}}%
+ \fi
+ \skip@\lastskip \edef\next{\the\skip@}\ifx\next\zero@skip\else\vskip-\skip@\fi
+ \penalty\z@ % update page parameters
+ \fam-\insertpenalties
+ \insert#2{\floatingpenalty\@ne}%
+ \ifx\next\zero@skip\else\vskip\skip@\fi
+ \advance\fam\insertpenalties % 0: no held; 1: held over
+ \expandafter\endgroup
+ \ifnum\fam=\@ne % then do eject
+% \message{There are held-over \string#2 inserts; performing \string#1. }%
+ \ifdim\pagetotal<\topskip \leftline{}\kern-\topskip\fi % avoid empty list
+ {\dimen@\pagetotal \advance\dimen@\pagedepth
+ \ifdim\dimen@<\pagegoal\vfill\fi}%
+ #1\@barrier{#1}{#2}\else
+% \message{There are no held-over \string#2 inserts. \space}%
+\fi
+}
+
+\def\placeinsoutput{%
+\ifnum\outputpenalty=-20030\relax % eject if any footnotes
+ \ifvoid\footins\else
+ \fam\insertpenalties \advance\fam\@ne \insertpenalties\fam
+ \fi \outputpenalty=-20029\relax
+\fi
+\ifnum\outputpenalty=-20029\relax % Check for `supereject' flag
+ \ifnum\insertpenalties>\z@ % something is being held over, must get it out
+% \message{Forcing insertions on their own pages. \space}%
+ \ifvoid\footins \r@ggedbottomtrue \else \advance\skip\footins 0ptplus1fil\fi
+ \noplaceoutput % performs \supereject
+ \else % must rejoin seamlessly:
+ \placerestoreoutput
+ \fi
+\else % check for other flag...
+ \ifnum\outputpenalty=-10028 % in the middle of ejecting
+ \ifnum\insertpenalties=\z@ \global\setbox\@cclv\vbox{}\fi
+ \outputpenalty=-10029
+ \fi
+ \ifnum\outputpenalty=-10029\relax % section start
+ \ifnum\insertpenalties>\z@ % something is being held over, must get it out
+% \message{Forcing insertions. \space}%
+ \ifvoid\footins \r@ggedbottomtrue \else \advance\skip\footins 0ptplus1fil\fi
+ \noplaceoutput % performs \eject, perhaps repeatedly:
+ \leftline{}\kern-\topskip \penalty-10028\relax % (like \dosupereject)
+ \else % must rejoin seamlessly:
+ \placerestoreoutput
+ \fi
+ \else % just a regular page break
+ \noplaceoutput
+ \fi
+\fi
+}
+
+% there is a slim chance that footnotes may lose their place.
+\def\placerestoreoutput{%
+ \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+ \ifvoid\topins\else\insert\topins{\unvbox\topins}\fi
+% If you have other floating insertion classes, do the same here.
+ \unvbox\@cclv
+}
+
+\catcode`\@=\noplaceoutput
+
+\edef\noplaceoutput{\the\output}
+\output{\placeinsoutput}