From b1c871653d37d9c6fd0f97b048dca051b5b1db27 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Thu, 12 Jan 2006 23:46:46 +0000
Subject: trunk/Master/texmf-dist/tex/plain

git-svn-id: svn://tug.org/texlive/trunk@621 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/plain/misc/placeins.tex | 135 ++++++++++++++++++++++++++
 1 file changed, 135 insertions(+)
 create mode 100644 Master/texmf-dist/tex/plain/misc/placeins.tex

(limited to 'Master/texmf-dist/tex/plain/misc/placeins.tex')

diff --git a/Master/texmf-dist/tex/plain/misc/placeins.tex b/Master/texmf-dist/tex/plain/misc/placeins.tex
new file mode 100644
index 00000000000..1f3a7211c47
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/misc/placeins.tex
@@ -0,0 +1,135 @@
+%  P L A C E I N S . T E X        ver 2.0   Mar 3, 1995
+%
+%  By   Donald Arseneau       <asnd@reg.triumf.ca>
+%
+%  Insertions that keep their place.
+%
+%  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}
-- 
cgit v1.2.3

