Move a tag
[latex2e.git] / latex2e-20160201 / required / tools / afterpage.dtx
blob4722377aeaf74c4ffd8f0b071c5bf3e0fd2d6e0e
1 % \iffalse meta-comment
3 % Copyright 1993-2014
5 % The LaTeX3 Project and any individual authors listed elsewhere
6 % in this file.
8 % This file is part of the Standard LaTeX `Tools Bundle'.
9 % -------------------------------------------------------
11 % It may be distributed and/or modified under the
12 % conditions of the LaTeX Project Public License, either version 1.3c
13 % of this license or (at your option) any later version.
14 % The latest version of this license is in
15 %    http://www.latex-project.org/lppl.txt
16 % and version 1.3c or later is part of all distributions of LaTeX
17 % version 2005/12/01 or later.
19 % The list of all files belonging to the LaTeX `Tools Bundle' is
20 % given in the file `manifest.txt'.
22 % \fi
23 % \iffalse
24 %% File: afterpage.dtx Copyright (C) 1994 1994 1995 David Carlisle
26 %<package>\NeedsTeXFormat{LaTeX2e}
27 %<package>\ProvidesPackage{afterpage}
28 %<package>         [2014/10/28 v1.08 After-Page Package (DPC)]
30 %<*driver>
31 \documentclass{ltxdoc}
32 \usepackage{afterpage}
33 \GetFileInfo{afterpage.sty}
34 \begin{document}
35 \title{The \textsf{afterpage} package\thanks{This file
36         has version number \fileversion, last
37         revised \filedate.}}
38 \author{David Carlisle}
39 \date{\filedate}
40 \MaintainedByLaTeXTeam{tools}
41 \maketitle
42 \DocInput{afterpage.dtx}
43 \end{document}
44 %</driver>
45 % \fi
47 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 % \changes{v1.00}{1993/01/25}{Initial version}
50 % \changes{v1.05}{1993/07/14}{First public version}
51 % \changes{v1.06}{1994/02/01}{Update for LaTeX2e}
52 % \changes{v1.07}{1994/05/23}{Documentation Changes}
53 % \changes{v1.08}{1995/10/27}
54 %      {Use \cs{par} not \cs{endgraf}, for tools/1579}
55 % \changes{v1.08}{1995/10/27}
56 %      {Try and do something sensible with nested \cs{clearpage},
57 %       for tools/1880}
58 % \changes{v1.08}{1995/10/27}
59 %      {Try and do something sensible with footnotes, for tools/1884}
61 % \CheckSum{269}
63 % This package implements a command, |\afterpage|, that causes the
64 % commands specified in its argument to be expanded after the current
65 % page is output.\footnote{This is really a pre-release, to see whether
66 % people like the idea of a command like this. This implementation is
67 % \emph{not} particularly robust. This implementation does not work in
68 % two column mode, and can get `confused' by \LaTeX's floating
69 % environments.}
71 % \begin{enumerate}
72 % \item Sometimes \LaTeX's float positioning mechanism gets overloaded,
73 % and all floating |figure|s and |table|s drift to the end of the
74 % document. One may flush out all the unprocessed floats by issuing a
75 % |\clearpage| command, but this has the effect of making the current
76 % page end prematurely. Now you can issue |\afterpage{\clearpage}| and
77 % the current page will be filled up with text as usual, but then a
78 % |\clearpage| command will flush out all the floats before the next
79 % text page begins.
80 % \item An earlier mechanism to help with float placement was the
81 % optional argument |[H]| (meaning {\bf HERE!}) which was originally
82 % added to the standard floating environments by |here.sty|, and is now
83 % provided by |float.sty|. However some |[H]| users have commented that
84 % they did not really mean `Here!' They actually wanted `Somewhere
85 % close'. This can now be achieved by\\
86 %  |\afterpage{\clearpage\begin{figure}[H] |\ldots
87 %  |\end{figure}}|\\
88 % This ensures that the figure is at the top of the next page. (The
89 % |\clearpage| stops any other figures drifting past the |[H]| figure.)
90 % \item Floating longtables. |longtable.sty| provides the |longtable|
91 % environment, a multi-page version of |tabular|. Many |longtable| users
92 % have told me that it is difficult to set the text surrounding the long
93 % table, and that they wanted a `floating' version. As, presumably,
94 % |longtable|s are long, they are probably too large to hold in memory,
95 % and float in the way that the |table| environment is floated, however
96 % if the table is in a separate file, say |ltfile.tex|, you can now
97 % use one of:\\
98 % |\afterpage{\clearpage\input{ltfile}}|\\
99 % |\afterpage{\clearpage\input{ltfile}\clearpage}|.\\
100 % The first form lets text appear on the same page as the end of the
101 % longtable, the second ensures that the surrounding text starts again
102 % on a new page.
103 % \end{enumerate}
105 % \StopEventually{}
107 %    \begin{macrocode}
108 %<*package>
109 %    \end{macrocode}
111 % \begin{macro}{\afterpage}
112 % The token register used to save the old output routine.
113 %    \begin{macrocode}
114 \newtoks\AP@output
115 \global\AP@output\expandafter{\the\output}
116 %    \end{macrocode}
118 % A box register used to save any part of the next page which has
119 % already been processed.
120 %    \begin{macrocode}
121 \newbox\AP@partial
122 %    \end{macrocode}
124 % A box register used to save any footnote texts that are `tied' to
125 % the text that gets saved in |\AP@partial|.
126 %    \begin{macrocode}
127 \newbox\AP@footins
128 %    \end{macrocode}
130 % The following macro attempts to get safely into vertical mode, and
131 % then invokes a special output routine to grab the current page into
132 % |\AP@partial|.
133 %    \begin{macrocode}
134 \def\AP@savetop{%
135 %    \end{macrocode}
136 % Now begins a test to see what state we are in. |\AP@noindent|  will
137 % be defined so as to return to this state (well, almost!) after
138 % afterpage has finished.
139 %    \begin{macrocode}
140   \ifvmode
141 %    \end{macrocode}
142 % Vertical mode. This is the simplest case, do nothing.
143 %    \begin{macrocode}
144     \let\AP@noindent\empty
145   \else\ifhmode
146 %    \end{macrocode}
147 % Horizontal mode.
148 % `Back out' into vertical mode, removing the indentation box as we go.
149 % If in fact there was no indentation box, the output routine was
150 % invoked by |\noindent| (what bad luck!) so we have to remember to
151 % re-insert the |\noindent| before the paragraph is seen again.
152 % |\everypar| tokens have already been inserted, so don't insert them
153 % again.
154 %    \begin{macrocode}
155     \setbox\z@\lastbox
156     \edef\AP@noindent
157       {{\everypar{}\ifvoid\z@\noindent\else\indent\fi}}%
158     \par
159   \else
160 %    \end{macrocode}
161 % The remaining (even worse) possibility that the output routine
162 % was triggered by the start of displaymath within a paragraph.
164 % Come out of displaymath with |$$|, then adjust the spacing (getting
165 % into vmode at the same time). |\AP@noindent| will restart display math
166 % later. |\everydisplay| tokens have already been inserted (they apply
167 % to the math list that will be started by |\AP@noindent|, even though
168 % they were triggered by the display math that was closed by the lines
169 % below!). Save the values |\prevgraf| and |\predisplaysize| for use in
170 % the re-started math list.
171 %    \begin{macrocode}
172     \abovedisplayshortskip\z@\abovedisplayskip\z@
173     \belowdisplayshortskip\z@\belowdisplayskip\z@
174     \xdef\AP@disp{%
175       \predisplaysize\the\predisplaysize
176       \prevgraf\the\prevgraf\relax}%
177     $$\vskip-\baselineskip\vskip-\parskip
178     \edef\AP@noindent{%
179 %    \end{macrocode}
180 % Do not insert |\everydisplay| tokens again.
181 %    \begin{macrocode}
182       \toks@{\the\everydisplay}\everydisplay{}%
183 %    \end{macrocode}
184 % Start displaymath mode with no spurious paragraph line above it.
185 % Restore |\prevgraf| and |\predisplaysize|.  Use |\aftergroup| to
186 % restore the correct setting for |\everydisplay| after this display
187 % has finished.
188 %    \begin{macrocode}
189       {\everypar{}\noindent}$$\AP@disp\aftergroup\noexpand\AP@ed}%
190   \fi\fi
191 %    \end{macrocode}
192 % Now switch the  output routine and remove everything from the current
193 % page into the box |\AP@partial|.
194 %    \begin{macrocode}
195   \begingroup
196   \nointerlineskip\null
197     \output{%
198       \global\setbox\AP@partial\vbox{%
199         \unvbox\@cclv
200          \global\setbox\@ne\lastbox}%
201 %    \end{macrocode}
202 % If the text that is saved in |\AP@partial| had footnotes, we'd
203 % better grab them as well otherwise they may come out on a page
204 % with the `afterpage' text, before the page that has the
205 % footnote mark! (Added at v1.08.)
206 %    \begin{macrocode}
207        \global\setbox\AP@footins\box\footins}%
208 %    \end{macrocode}
209 % Having defined the output routine, trigger it\ldots
210 %    \begin{macrocode}
211   \eject
212   \endgroup}
213 %    \end{macrocode}
215 % |\AP@| stores all the commands that must be executed after the page
216 % break.
217 %    \begin{macrocode}
218 \let\AP@\relax
219 %    \end{macrocode}
221 % Restore the |\everydisplay| register. |\ignorespaces| prevents a space
222 % or newline after |$$| creating rogue a indentation or paragraph.
223 %    \begin{macrocode}
224 \def\AP@ed{\everydisplay\expandafter{\the\toks@}\ignorespaces}
225 %    \end{macrocode}
227 % Remove the current vertical list, insert the commands |\AP@|
228 % at the top of the page, and then re-insert the saved text.
229 %    \begin{macrocode}
230 \def\AP@@{%
231   \AP@savetop
232   \global\expandafter\let\expandafter\AP@\expandafter\relax\AP@
233   \par
234 %    \end{macrocode}
235 % The text originally at the top of this page is now stored in the box
236 % |\AP@partial|, including  |\topskip| glue. Now we want to unbox
237 % |\AP@partial|, placing the baseline of the first row |\baselineskip|
238 % below the baseline of the last line coming from the afterpage text.
239 % If we assumed nothing has too much height or depth (and |\topskip| is
240 % rigid), it would be fairly trivial to position the contents of
241 % |\AP@partial| so that the baseline of the first row was
242 % |\baselineskip| below the last row just added.
244 % In this version, I thought it might be fun to try to exactly achieve
245 % the |\baselineskip|--or--|\lineskip| calculation that \TeX\ normally
246 % does internally.  The call to |\addboxcontents| does the right thing
247 % (I hope).
248 %    \begin{macrocode}
249    \addboxcontents\AP@partial
250 %    \end{macrocode}
251 % Now re-insert any footnote text. This may not be quite the right
252 % place, as the text that has just been unboxed may break over a page
253 % in its new position. Also it may not be the right number if the text
254 % from |\afterpage| itself contains footnotes. Too bad!
255 %    \begin{macrocode}
256   \ifvoid\AP@footins\else
257          \insert\footins{\unvbox\AP@footins}\fi
258 %    \end{macrocode}
259 % Now repair things if we started off in horizontal mode.
260 %    \begin{macrocode}
261   \AP@noindent}
262 %    \end{macrocode}
264 % If |\AP@| is not |\relax| then the current page already has some
265 % `afterpage' commands, so just add the new commands to the end of the
266 % list. Otherwise save the commands in |\AP@|. (within a local group),
267 % and switch the output routine. (The new output routine just calls the
268 % old one if it is invoked by a \LaTeX{} float.
269 %    \begin{macrocode}
270 \long\def\afterpage#1{%
271   \ifx\AP@\relax
272     \gdef\AP@{{#1\par}}%
273     \global\output{%
274       \the\AP@output
275       \ifnum\outputpenalty>-\@Mi
276         \global\output\expandafter{\the\AP@output}%
277         \aftergroup\AP@@
278       \fi}%
279   \else
280     \expandafter\gdef\expandafter\AP@\expandafter{\AP@{#1\par}}%
281   \fi}
282 %    \end{macrocode}
284 % If we have got to the end of the document or clearpage
285 % just put the stuff out  without any trickery.
286 %    \begin{macrocode}
287 \let\AP@clearpage\clearpage
288 \def\clearpage{%
289   \ifx\AP@\relax
290     \AP@clearpage
291   \else
292     \global\output\expandafter{\the\AP@output}%
293     \AP@clearpage
294 %    \end{macrocode}
295 % At this point (since v1.08) Need to clear |\AP@| \emph{before}
296 % using its expansion, as otherwise hit an infinite loop. Sigh.
297 %    \begin{macrocode}
298     \global\expandafter\let\expandafter\AP@\expandafter\relax
299     \expandafter\expandafter\AP@
300   \fi}
301 \let\AP@enddocument\enddocument
302 \def\enddocument{%
303   \ifx\AP@\relax\else
304     \global\output\expandafter{\the\AP@output}%
305     \AP@clearpage
306     \global\expandafter\let\expandafter\AP@\expandafter\relax
307     \expandafter\expandafter\AP@
308   \fi
309     \AP@enddocument}
310 %    \end{macrocode}
311 % \end{macro}
313 % \begin{macro}{\addboxcontents}
314 % Given a vbox |#1|, add to the current vertical list such that the end
315 % result is equivalent to the list that \TeX\ would have built had the
316 % contents of |#1| (apart from any initial glue) been added individually
317 % to the current list.
319 % So essentially, the problem is that of unboxing |#1|, but replacing
320 % the glue at the top of |#1| with (something equivalent to) the
321 % |\baselineskip| or |\lineskip| glue that \TeX\ would normally have
322 % placed before the first box in |#1|. Also |\prevdepth| must be set at
323 % the end.
324 %    \begin{macrocode}
325 \def\addboxcontents#1{{%
326 %    \end{macrocode}
327 % Perhaps I shouldn't use grouping here, as I probably don't really want
328 % to save |#1|. If it is removed, |\splittopskip| and |\splitmaxdepth|
329 % would need to be restored by hand.
331 % First replace any glue at the top by |\vskip 0pt|.
332 %    \begin{macrocode}
333   \splittopskip\z@
334   \splitmaxdepth\maxdimen
335   \setbox#1\vbox{\break\unvbox#1}%
336   \setbox\z@\vsplit#1to\z@
337 %    \end{macrocode}
338 % Put the breakpoint back.
339 %    \begin{macrocode}
340   \setbox#1\vbox{\break\unvbox#1}%
341 %    \end{macrocode}
342 % Set |\skip@| to be height of |#1| (without top glue)
343 %    \begin{macrocode}
344   \skip@\ht#1%
345 %    \end{macrocode}
346 % Now make the first baseline of the first row be |\vsize| from the top.
347 % (This assumes that the first row has height less than |\vsize|.)
348 %    \begin{macrocode}
349   \splittopskip\vsize
350   \setbox\z@\vsplit#1to\z@
351 %    \end{macrocode}
352 % Subtract the new height of |#1| from |\skip@|, and add back on
353 % |\splittopskip|, so |\skip@| is now the height of the first row of
354 % |#1| This may still be 0pt if (eg) a mark or whatsit is between the
355 % top glue and the first box. Save (this height${}-{}$|\splittopskip|)
356 % in |\skip\tw@|.
357 %    \begin{macrocode}
358   \advance\skip@-\ht#1%
359   \skip\tw@\skip@
360   \advance\skip@\splittopskip
361 %    \end{macrocode}
362 % Now fake \TeX's |\baselineskip| calculation.
363 %    \begin{macrocode}
364   \advance\skip@\prevdepth
365   \advance\skip@-\baselineskip
366   \advance\skip\tw@\ifdim-\skip@<\lineskiplimit\lineskip\else-\skip@\fi
367 %    \end{macrocode}
368 % Finally add the glue.
369 %    \begin{macrocode}
370   \vskip\skip\tw@
371 %    \end{macrocode}
372 % Now unbox the box, setting |\prevdepth| by hand, as |\unvbox| (unlike
373 % |\box|) does not automatically set it.
374 %    \begin{macrocode}
375   \global\dimen@i\dp#1%
376   \unvbox#1}%
377   \prevdepth\dimen@i}
378 %    \end{macrocode}
379 % \end{macro}
381 %    \begin{macrocode}
382 %</package>
383 %    \end{macrocode}
385 % \Finale