diff options
Diffstat (limited to 'Master/texmf-dist/source/latex-dev/base/ltshipout.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex-dev/base/ltshipout.dtx | 825 |
1 files changed, 567 insertions, 258 deletions
diff --git a/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx b/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx index 8d6150b5930..650c46866e4 100644 --- a/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx +++ b/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx @@ -1,24 +1,38 @@ % \iffalse meta-comment -% +%% %% File: ltshipout.dtx (C) Copyright 2020 Frank Mittelbach, LaTeX Team +%% % -% It may be distributed and/or modified under the conditions of the -% LaTeX Project Public License (LPPL), either version 1.3c of this -% license or (at your option) any later version. The latest version -% of this license is in the file +% This file is part of the LaTeX base system. +% ------------------------------------------- % +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in % https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008 or later. +% +% This file has the LPPL maintenance status "maintained". % +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. % -% The development version of the bundle can be found below +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi % -% https://github.com/FrankMittelbach/... +% \iffalse % -% for those people who are interested or want to report an issue. +%%% From File: ltshipout.dtx % % \begin{macrocode} -\providecommand\ltshipoutversion{v0.9a} -\providecommand\ltshipoutdate{2020/07/15} +\providecommand\ltshipoutversion{v1.0a} +\providecommand\ltshipoutdate{2020/08/31} % \end{macrocode} % %<*driver> @@ -53,7 +67,8 @@ % % \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}} % -% \newcommand\hook[1]{\texttt{#1}} +% \providecommand\hook[1]{\texttt{#1}} +% \providecommand\pkg[1]{\texttt{#1}} % % % \title{The \texttt{ltshipout} package\thanks{This package has version @@ -94,13 +109,13 @@ % manipulated through a set of hooks after which it is shipped out % for real. % \end{function} - +% % \begin{variable}{\ShipoutBox,\l_shipout_box} % This box register is called \cs{ShipoutBox} (alternatively available via the % L3 name \cs{l_shipout_box}). % \end{variable} % - +% % \begin{variable}{\l_shipout_box_ht_dim, % \l_shipout_box_dp_dim,\l_shipout_box_wd_dim, % \l_shipout_box_ht_plus_dp_dim} @@ -136,7 +151,7 @@ % \item[\hook{shipout/background}] % % This hook adds a picture environment into the background of -% the page (with the \texttt{(0,0)} coordinate in the top-left +% the page with the \texttt{(0,0)} coordinate in the top-left % corner using a \cs{unitlength} of \texttt{1pt}. % % It should therefore only receive \cs{put} commands or other @@ -144,10 +159,6 @@ % vertical coordinate values would normally be % negative. % -% \fmi{Again, mainly \pkg{atbegshi} compatibility. Not -% sure it is best to have to always use negative -% coordinates.} -% % Technically this is implemented by adding a zero-sized % \cs{hbox} as the very first item into the \cs{ShipoutBox} % containing that \texttt{picture} environment. Thus the rest of @@ -157,7 +168,7 @@ % \item[\hook{shipout/foreground}] % % This hook adds a picture environment into the foreground of -% the page (with the \texttt{(0,0)} coordinate in the top-left +% the page with the \texttt{(0,0)} coordinate in the top-left % corner using a \cs{unitlength} of \texttt{1pt}. % % Technically this is implemented by adding a zero-sized @@ -171,29 +182,30 @@ % \item[\hook{shipout/firstpage}] % % The material from this hook is executed only once at the very -% beginning of the first output page. It should only contain -% \cs{special} commands needed to direct post processors -% handling the \texttt{.dvi} or \texttt{.pdf} output.\fmi{not -% sure it has to be that restrictive.} +% beginning of the first output page that is shipped out (i.e., +% not discarded at the last minute). It should only contain +% \cs{special} or similar commands needed to direct post processors +% handling the \texttt{.dvi} or \texttt{.pdf} output.\footnotemark % -% In \LaTeXe{} that was already existing but implemented as a box -% register \cs{@begindvibox}. -% \fmi{drop or at least mark the obsolete code in latex.ltx} +% ^^A \fmi{not sure it has to be that restrictive.} % % % \item[\hook{shipout/lastpage}] % % The corresponding hook to add \cs{special}s at the very end of -% the output file. It is only entered on the very last page. +% the output file. It is only executed on the very last page --- +% or rather on the page that \LaTeX{} believes is the last one. % -% It may not be possible for \LaTeX{} to correctly determine which page is -% the last one without several reruns. If this happens and the -% hook is non-empty then \LaTeX{} will add an extra page to -% place the material and also request a rerun to get the correct -% placement sorted out. +% It may not be possible for \LaTeX{} to correctly determine +% which page is the last one without several reruns. If this +% happens and the hook is non-empty then \LaTeX{} will add an +% extra page to place the material and also request a rerun to +% get the correct placement sorted out. % % \end{description} -% \end{variable} +% \end{variable}\footnotetext{In +% \LaTeXe{} that was already existing, but implemented using a box +% register with the name \cs{@begindvibox}.} % % As mentioned above the hook \hook{shipout/before} is executed % first and can manipulate the prepared shipout box stored in @@ -280,7 +292,7 @@ % routine). More precisely, it is incremented only after it is % clear that a page will be shipped out, i.e., after the % \hook{shipout/before} hook (because that might discard the page)! - +% % Just like with the \texttt{page} counter its value is % only accurate within the output routine. In the body of the % document it may be off by one as the output routine is called @@ -314,22 +326,33 @@ % reliable inside the output routine! % \end{variable} % - +% \begin{variable}{\PreviousTotalPages} +% \begin{syntax} +% \cs{thetotalpages}/\cs{PreviousTotalPages} +% \end{syntax} +% Command that expands to the number of total pages from the +% previous run. If there was no previous run or if usedin the +% preamble it expands to +% \texttt{0}. Note that this is a command to a counter, so in order +% to display the number in, say, Roman numerals you have to assign +% its value to a counter and then use \cs{Roman} on that counter. +% \end{variable} +% % % \subsection{Debugging shipout code} % -% \begin{function}{\DebugShipoutOn,\DebugShipoutOff, +% \begin{function}{\DebugShipoutsOn,\DebugShipoutsOff, % \shipout_debug_on:,\shipout_debug_off:} % \begin{syntax} -% \cs{DebugShipoutOn} +% \cs{DebugShipoutsOn} % \end{syntax} % Turn the debugging of shipout code on or off. This displays % changes made to the shipout data structures. \fmi{This needs -% some rationalizing and will probably not stay this way.} +% some rationalizing and may not stay this way.} % \end{function} % % - +% % % \section{Emulating commands from other packages} % @@ -381,8 +404,8 @@ % just adding it to the hook should be sufficient. % \end{function} % - - +% +% % \begin{function}{\AtBeginShipoutBox} % This is the name of the shipout box as \pkg{atbegshi} knows it. % \end{function} @@ -406,13 +429,12 @@ % The \pkg{atbegshi} names for \cs{AtBeginDvi} and \cs{DiscardShipoutBox}. % \end{function} % - - - +% +% +% % \subsection{Emulating \pkg{everyshi}} % - - +% % \begin{function}{\EveryShipout} % \begin{syntax} % \cs{EveryShipout}\Arg{code} $\equiv$ \cs{AddToHook}\texttt{\{shipout/before\}}\Arg{code} @@ -425,15 +447,15 @@ % \end{syntax} % \end{function} % - - +% +% % \subsection{Emulating \pkg{atenddvi}} % % The \pkg{atenddvi} package implemented only a single command: % \cs{AtEndDvi} and that is now available out of the box. - - - +% +% +% % \subsection{Emulating \pkg{everypage}} % % This page takes over the original \cs{@begindvi} hook and replaces @@ -448,8 +470,20 @@ % % \section{The Implementation} % \begin{macrocode} -%<*2ekernel> %<@@=shipout> +% \end{macrocode} +% +% At the moment the whole module rolls back in one go, but if we +% make any modifications in later releases this will then need +% splitting. +% \begin{macrocode} +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2020/10/01}% +%<latexrelease> {\shipout}{Hook mangement (shipout)}% +% \end{macrocode} +% +% +% \begin{macrocode} \ExplSyntaxOn % \end{macrocode} % @@ -489,24 +523,10 @@ % \end{macro} % \end{macro} % - -% \begin{macro}{shipout/before, -% shipout/foreground,shipout/background, -% shipout/firstpage, -% shipout/lastpage} -% Declaring all hooks for the shipout code. -% \begin{macrocode} -\hook_new:n{shipout/before} -\hook_new:n{shipout/foreground} -\hook_new:n{shipout/background} -\hook_new:n{shipout/firstpage} -\hook_new:n{shipout/lastpage} -% \end{macrocode} -% \end{macro} - - - - +% +% +% +% % \begin{macro}{\ShipoutBox,\l_shipout_box} % The box filled with the page to be shipped out (both L3 and % \LaTeXe{} name). @@ -518,10 +538,10 @@ \cs_set_eq:NN \ShipoutBox \l_shipout_box % \end{macrocode} % \end{macro} - - - - +% +% +% +% % \begin{macro}{\@@_execute:} % This is going to the be the code run by \cs{shipout}. The code % follows closely the ideas from \pkg{atbegshi}, so not @@ -535,25 +555,25 @@ } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\shipout} % Overloading the \cs{shipout} primitive: % \begin{macrocode} \cs_gset_eq:NN \shipout \@@_execute: % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\l_@@_group_level_tl} % Helper token list to record the group level at which % \cs{@@_execute:} is encountered. \begin{macrocode} \tl_new:N \l_@@_group_level_tl % \end{macrocode} % \end{macro} - +% - +% % \begin{macro}{\@@_execute_test_level:} % If the group level has changed then we are still constructing % \cs{l_shipout_box} and to continue we need to wait until the @@ -567,8 +587,8 @@ } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\@@_execute_cont:} % When we have reached this point the shipout box has been % processed and is available in \cs{l_shipout_box} and ready for @@ -589,8 +609,10 @@ % Otherwise we assume that we will ship something and prepare for % final adjustments (in particular setting the state of % \cs{protect} while we are running the hook code). +% We also save the current \cs{protect} state to restore it later. % \begin{macrocode} \bool_gset_false:N \g_@@_discard_bool + \cs_set_eq:NN \@@_saved_protect: \protect \set@typeset@protect % \end{macrocode} % We also store the current shipout box dimension in registers, so that @@ -675,13 +697,13 @@ % % \begin{macrocode} \@@_get_box_size:N \l_shipout_box - \@kernel@before@shipout@foreground \hook_if_empty:nF {shipout/foreground} { \@@_add_foreground_picture:n { \hook_use:n {shipout/foreground} } } \hook_if_empty:nF {shipout/background} { \@@_add_background_picture:n - { \hook_use:n {shipout/background} } } + { \@kernel@before@shipout@background + \hook_use:n {shipout/background} } } % \end{macrocode} % We then run \cs{@@_execute_firstpage_hook:} that adds % the content of the hook \hook{shipout/firstpage} to the @@ -713,22 +735,52 @@ \tex_shipout:D \box_use:N \l_shipout_box } } +% \end{macrocode} +% Restore the value of \cs{protect} in case \cs{shipout} is called +% outside of the output routine (where it is automatically restored +% because of the implicit group). +% \begin{macrocode} + \cs_set_eq:NN \protect \@@_saved_protect: } } % \end{macrocode} % \end{macro} - - - -% \begin{macro}{\@kernel@after@shipout@lastpage,\@kernel@before@shipout@foreground} -% +% +% +% \begin{macro}{\@@_saved_protect:} +% Remeber the current \cs{protect} state. +% \begin{macrocode} +\cs_new_eq:NN \@@_saved_protect: \protect +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{shipout/before, +% shipout/foreground,shipout/background, +% shipout/firstpage, +% shipout/lastpage} +% Declaring all hooks for the shipout code. +% \begin{macrocode} +\hook_new:n{shipout/before} +\hook_new:n{shipout/foreground} +\hook_new:n{shipout/background} +\hook_new:n{shipout/firstpage} +\hook_new:n{shipout/lastpage} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@kernel@after@shipout@lastpage, +% \@kernel@before@shipout@background} +% And here are the internal kernel hooks going before or after the +% public ones where needed. % \begin{macrocode} \let\@kernel@after@shipout@lastpage\@empty -\let\@kernel@before@shipout@foreground\@empty +\let\@kernel@before@shipout@background\@empty % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\@@_execute_firstpage_hook: } % This command adds any specials into a box and adds that to the % very beginning of the first box shipped out. After that we @@ -750,15 +802,15 @@ % \begin{macrocode} \cs_gset_eq:NN \@@_execute_firstpage_hook: \prg_do_nothing: \cs_gset:Npn \@@_add_firstpage_material:Nn ##1 ##2 { - \PackageWarning{ltshipout}{ + \@latex@warning{ First~ page~ is~ already~ shipped~ out,~ ignoring\MessageBreak \string##1 } } } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\g_@@_lastpage_handled_bool} % A boolean to signal if we have already handled the % \hook{shipout/lastpage} hook. @@ -766,9 +818,9 @@ \bool_new:N \g_@@_lastpage_handled_bool % \end{macrocode} % \end{macro} - - - +% +% +% % \begin{macro}{\@@_add_firstpage_material:Nn} % This command adds material to the % \hook{shipout/firstpage} hook. It is used in @@ -782,13 +834,13 @@ } % \end{macrocode} % \end{macro} - - - - - - - +% +% +% +% +% +% +% % \begin{macro}{\@@_get_box_size:N} % Store the box dimensions in dimen registers. % \fmi{This could/should perhaps be generalized to set height depth and @@ -803,7 +855,7 @@ } % \end{macrocode} % \end{macro} - +% % \begin{macro}{\l_shipout_box_ht_dim, % \l_shipout_box_dp_dim,\l_shipout_box_wd_dim, % \l_shipout_box_ht_plus_dp_dim} @@ -815,20 +867,20 @@ \dim_new:N \l_shipout_box_ht_plus_dp_dim % \end{macrocode} % \end{macro} - - - - - +% +% +% +% +% % \begin{macro}{\g_@@_discard_bool} % Indicate whether or not the current page box should be discarded % \begin{macrocode} \bool_new:N \g_@@_discard_bool % \end{macrocode} % \end{macro} - - - +% +% +% % \begin{macro}{\l_@@_tmp_box,\l_@@_saved_badness_tl} % We need a box for the background and foreground material and a % token register to remember badness settings as we disable them @@ -838,8 +890,8 @@ \tl_new:N \l_@@_saved_badness_tl % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\@@_add_background_box:n} % In standard \LaTeX{} the shipout box is always a \cs{vbox} but % here we are allow for other usage as well, in case some package @@ -930,10 +982,10 @@ } % \end{macrocode} % \end{macro} - - - - +% +% +% +% % \begin{macro}{\@@_add_foreground_box:n} % Foreground boxes are done in the same way, only the order and % placement of boxes has to be done differently. @@ -993,17 +1045,21 @@ } % \end{macrocode} % \end{macro} - - - - -% \begin{macro}{\c_@@_horigin_tl,\c_@@_vorigin_tl} +% +% +% +% +% \begin{macro}{\@@_init_page_origins:,\c_@@_horigin_tl,\c_@@_vorigin_tl} % Two constants holding the offset of the top-left with respect to % the media box. % % Setting the constants this way is courtesy of Bruno. +% +% We delay setting the constants to the last possible place as +% there might be updates in the preamble or even in the +% \hook{begindocument} hook that affects their setup. % \begin{macrocode} -\tl_gput_right:Nn \@kernel@after@begindocument { +\cs_new:Npn \@@_init_page_origins: { \tl_const:Nx \c_@@_horigin_tl { \cs_if_exist_use:NTF \pdfvariable { horigin } @@ -1014,11 +1070,17 @@ \cs_if_exist_use:NTF \pdfvariable { vorigin } { \cs_if_exist_use:NF \pdfvorigin { 1in } } } +% \end{macrocode} +% After the constants have been set there is no need to execute +% this command again, in fact it would raise an error, so we +% redefine it to do nothing. +% \begin{macrocode} + \cs_gset_eq:NN \@@_init_page_origins: \prg_do_nothing: } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\@@_picture_overlay:n} % Put the argument into a \texttt{picture} environment that doesn't take up % any size and uses \texttt{1pt} for \cs{unitlength}. @@ -1026,6 +1088,14 @@ % not it is not.} % \begin{macrocode} \cs_new:Npn \@@_picture_overlay:n #1 { +% \end{macrocode} +% The very first time this is executed we have ot initializes (and +% freeze) the origins. +% \begin{macrocode} + \@@_init_page_origins: +% \end{macrocode} +% +% \begin{macrocode} \kern -\c_@@_horigin_tl \scan_stop: \vbox_to_zero:n { \kern -\c_@@_vorigin_tl \scan_stop: @@ -1040,20 +1110,21 @@ } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\@@_add_background_picture:n} % Put a \texttt{picture} env in the background of the shipout box % with its reference point in the top-left corner. +% % \begin{macrocode} \cs_new:Npn \@@_add_background_picture:n #1 { \@@_add_background_box:n { \@@_picture_overlay:n {#1} } } % \end{macrocode} % \end{macro} - - - +% +% +% % \begin{macro}{\@@_add_foreground_picture:n} % % Put a \texttt{picture} env in the foreground of the shipout box @@ -1064,8 +1135,8 @@ } % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\shipout_discard:} % Request that the next shipout box should be discarded. At the % moment this is just setting a boolean, but we may want to augment @@ -1078,18 +1149,18 @@ } % \end{macrocode} % \end{macro} - - - - +% +% +% +% % \subsection{Handling the end of job hook} - +% % At the moment this is partly solved by using the existing hooks. % But rather than putting the code into these hooks it should be % moved to the right place directly as we shouldn't prefill hooks % with material unless it needs to interact with other code. % - +% % % \begin{macro}{\g_shipout_readonly_int,\ReadonlyShipoutCounter} % We count every shipout activity that makes a page (but not those @@ -1103,7 +1174,7 @@ \cs_new_eq:NN \ReadonlyShipoutCounter \g_shipout_readonly_int % \end{macrocode} % \end{macro} - +% % \begin{macro}{\g_shipout_totalpages_int,\c@totalpages} % We count every shipout attempt (even those that are discarded) in % tis counter. It is not used in the code but may get used in user @@ -1120,15 +1191,15 @@ % \end{macrocode} % \end{macro} % - - - +% +% +% % \begin{macro}{\@abspage@last} % In \cs{@abspage@last} record the number of pages from the last % run. This is written to the \texttt{.aux} and this way made % available to the next run. In case there is no \texttt{.aux} file % or the statement is missing from it we initialize it with the -% largest possible number in \TeX{}. We use this a s the default +% largest possible number in \TeX{}. We use this as the default % because then we are inserting the \hook{shipout/lastpage} on % the last page (or after the last page but not on page 1 for a % multipage document. @@ -1136,8 +1207,8 @@ \xdef\@abspage@last{\number\maxdimen} % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\enddocument} % % Instead of using the hooks \hook{enddocument} and @@ -1188,7 +1259,7 @@ { % \end{macrocode} % This ends up in the \texttt{.aux} so we use \LaTeXe{} names here. -% \fmi{this needs an interface for \cs{nofiles} in expl3, doesn't at the moment!} +% \fmi{This needs an interface for \cs{nofiles} in expl3, doesn't at the moment!} % \begin{macrocode} \if@filesw \iow_now:Nx \@auxout { @@ -1202,32 +1273,47 @@ % run but helps to keep pdf viewers happy. % \begin{macrocode} \bool_if:NF \g_@@_lastpage_handled_bool - { \tex_shipout:D\vbox to\textheight{ - \hbox{\UseHook{shipout/lastpage} \@kernel@after@shipout@lastpage } + { +% \end{macrocode} +% However, making this extra page in case the hook is actually +% empty would be forcing a rerun without any reason, so we check +% that condition and also check if +% \cs{@kernel@after@shipout@lastpage} contains any code. If both +% are empty we omit the page generation. +% \begin{macrocode} + \bool_lazy_and:nnF + { \hook_if_empty_p:n {shipout/lastpage} } + { \tl_if_empty_p:N \@kernel@after@shipout@lastpage } + { + \tex_shipout:D\vbox to\textheight + { + \hbox:n { \UseHook{shipout/lastpage} + \@kernel@after@shipout@lastpage } % \end{macrocode} % This extra page could be totally empty except for the hook % content, but to help the user understanding why it is there we % put some text into it. % \begin{macrocode} - \@@_excuse_extra_page: - \null - } + \@@_excuse_extra_page: + \null + } % \end{macrocode} -% At this point we should also signal to \LaTeX{} that a rerun is +% At this point we also signal to \LaTeX{}'s endgame that a rerun is % necessary so that an appropriate message can be shown on the -% terminal. -% -% \fmi{integrate warning ``Rerun \ldots'' } +% terminal. We do this by simply defining a command used as a flag and +% tested \cs{enddocument}. % \begin{macrocode} - } - } + \cs_gset_eq:NN \@extra@page@added \relax + } + } + } } % \end{macrocode} % \end{macro} % \end{macro} - - - +% +% +% % \begin{macro}{\@@_excuse_extra_page:} % Say mea culpa \ldots % \begin{macrocode} @@ -1248,178 +1334,401 @@ } % \end{macrocode} % \end{macro} - - - - +% +% +% \begin{macro}{\PreviousTotalPages,\@kernel@before@begindocument} +% In the preamble before the \texttt{aux} file was read +% \cs{PreviousTotalPages} is always zero. +% \begin{macrocode} +\def\PreviousTotalPages{0} +% \end{macrocode} +% In the \texttt{aux} file there should be an update for +% \cs{@abspage@last} recording the number of pages from the +% previous run. If not that macro holds the value of +% \cs{maxdimen}. So we test for it and update +% \cs{PreviousTotalPages} if there was a real value. This should +% happen just before the \hook{begindocument} hook is executed so +% that the value can be used inside that hook. +% \begin{macrocode} +\g@addto@macro\@kernel@before@begindocument + {\ifnum\@abspage@last<\maxdimen + \xdef\PreviousTotalPages{\@abspage@last}\fi} +% \end{macrocode} +% \end{macro} +% +% % \section{Legacy \LaTeXe{} interfaces} - - - +% +% +% % \begin{macro}{\DiscardShipoutBox} % Request that the next shipout box is to be discarded. % \begin{macrocode} \cs_new_eq:NN \DiscardShipoutBox \shipout_discard: % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\AtBeginDvi} % % \begin{macrocode} -\renewcommand \AtBeginDvi {\@@_add_firstpage_material:Nn \AtBeginDvi} +\DeclareRobustCommand \AtBeginDvi {\@@_add_firstpage_material:Nn \AtBeginDvi} % \end{macrocode} % \end{macro} - - -% \begin{macro}{\DebugShipoutOn,\DebugShipoutOff} +% +% +% \begin{macro}{\DebugShipoutsOn,\DebugShipoutsOff} % % \begin{macrocode} -\cs_new_eq:NN \DebugShipoutOn \shipout_debug_on: -\cs_new_eq:NN \DebugShipoutOff \shipout_debug_off: +\cs_new_eq:NN \DebugShipoutsOn \shipout_debug_on: +\cs_new_eq:NN \DebugShipoutsOff \shipout_debug_off: % \end{macrocode} % \end{macro} - - - - - +% +% +% \section{Internal commands needed elsewhere} +% +% These internal commands use double and triple \texttt{@} signs so +% we need to stop getting them translated to the module name. +% \begin{macrocode} +%<@@=> +% \end{macrocode} +% +% \begin{macro}{\@expl@@@shipout@add@firstpage@material@@Nn, +% \@expl@@@shipout@add@background@box@@n, +% \@expl@@@shipout@add@foreground@box@@n, +% \@expl@@@shipout@add@background@picture@@n, +% \@expl@@@shipout@add@foreground@picture@@n} +% Some internals needed elsewhere. +% +% \begin{macrocode} +\cs_set_eq:NN \@expl@@@shipout@add@firstpage@material@@Nn + \__shipout_add_firstpage_material:Nn +% \end{macrocode} +% +% \begin{macrocode} +\cs_set_eq:NN \@expl@@@shipout@add@background@box@@n + \__shipout_add_background_box:n +% \end{macrocode} +% +% \begin{macrocode} +\cs_set_eq:NN \@expl@@@shipout@add@foreground@box@@n + \__shipout_add_foreground_box:n +% \end{macrocode} +% +% \begin{macrocode} +\cs_set_eq:NN \@expl@@@shipout@add@background@picture@@n + \__shipout_add_background_picture:n +% \end{macrocode} +% +% \begin{macrocode} +\cs_set_eq:NN \@expl@@@shipout@add@foreground@picture@@n + \__shipout_add_foreground_picture:n +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\ExplSyntaxOff +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% +% Rolling back here doesn't undefine the interface commands as they +% may be used in packages without rollback functionality. So we +% just make them do nothing which may or may not work depending on +% the code usage. +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\shipout}{The hook management (shipout)}% +%<latexrelease>\expandafter\let\expandafter\shipout\csname tex_shipout:D\endcsname +%<latexrelease> +%<latexrelease>\let \ShipoutBox\@undefined +%<latexrelease>\let \ReadonlyShipoutCounter \@undefined +%<latexrelease>\let \c@totalpages \@undefined +%<latexrelease>\let \thetotalpages \@undefined +%<latexrelease> +%<latexrelease>\let \DiscardShipoutBox \@undefined +%<latexrelease>\let \DebugShipoutsOn \@undefined +%<latexrelease>\let \DebugShipoutsOff \@undefined +%<latexrelease> +%<latexrelease>\DeclareRobustCommand \AtBeginDvi [1]{% +%<latexrelease> \global \setbox \@begindvibox +%<latexrelease> \vbox{\unvbox \@begindvibox #1}% +%<latexrelease>} +%<latexrelease> +%<latexrelease>\let \AtBeginShipout \@undefined +%<latexrelease>\let \AtBeginShipoutNext \@undefined +%<latexrelease> +%<latexrelease>\let \AtBeginShipoutFirst \@undefined +%<latexrelease> +%<latexrelease>\let \ShipoutBoxHeight \@undefined +%<latexrelease>\let \ShipoutBoxDepth \@undefined +%<latexrelease>\let \ShipoutBoxWidth \@undefined +%<latexrelease> +%<latexrelease>\let \AtBeginShipoutDiscard \@undefined +%<latexrelease> +%<latexrelease>\let \AtBeginShipoutAddToBox \@undefined +%<latexrelease>\let \AtBeginShipoutAddToBoxForeground \@undefined +%<latexrelease>\let \AtBeginShipoutUpperLeft \@undefined +%<latexrelease>\let \AtBeginShipoutUpperLeftForeground \@undefined +%<latexrelease> +%<latexrelease> +% \end{macrocode} +% We do not undo a substitution when rolling back. As the file +% support gets undone the underlying data is no longer used (and +% sufficiently obscure that should not interfer with existing +% commands) and properly removing it would mean we need to make the +% \cs{unclare@...} and its support macros available in all earlier +% kernel releases which is pointless (and actually worse). +% \begin{macrocode} +%\undeclare@file@substitution{everyshi.sty}{everyshi-ltx.sty} +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease> +%<latexrelease>\let \AtEndDvi \@undefined +% \end{macrocode} +% We do not reenable a disabled package load when rolling back. As the file +% support gets undone the underlying data is no longer checked (and +% sufficiently obscure that it should not interfer with existing +% commands) and properly removing it would mean we need to make the +% \cs{reenable@package@load} command available in all earlier +% kernel releases which is pointless (and actually worse). +% \begin{macrocode} +%\reenable@package@load{atenddvi} +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease> +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% % \section{Package emulation for compatibility} - - +% +% +% \subsection{Package \pkg{atenddvi} emulation} +% +% +% \begin{macro}{\AtEndDvi} +% This package has only one public command to simulating it is easy +% and actually sensible to provide as part of the kernel. +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2020/10/01}% +%<latexrelease> {\AtEndDvi}{atenddvi emulation}% +\ExplSyntaxOn +\cs_new:Npn \AtEndDvi {\AddToHook{shipout/lastpage}} +\ExplSyntaxOff +% \end{macrocode} +% As the package is integrate we prevent loading (no need to roll that back): +% \begin{macrocode} +\disable@package@load{atenddvi} + {\PackageWarning{atenddvi} + {Functionality of this package is already\MessageBreak + provided by LaTeX.\MessageBreak\MessageBreak + It is there no longer necessary to load it\MessageBreak + and you can safely remove it.\MessageBreak + Found on}} +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\AtEndDvi}{atenddvi emulation}% +%<latexrelease>\let \AtEndDvi \@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% % \subsection{Package \pkg{atbegshi} emulation} - +% +% +% +% +% +% \begin{macrocode} +%<*atbegshi-ltx> +\ProvidesPackage{atbegshi} + [2020/08/17 v1.0a + Emulation of the original atbegshi package^^Jwith kernel methods] +% \end{macrocode} +% +% % \begin{macro}{\AtBeginShipoutBox} % \begin{macrocode} -\cs_new_eq:NN \AtBeginShipoutBox \ShipoutBox +\let \AtBeginShipoutBox \ShipoutBox % \end{macrocode} % \end{macro} - - - +% +% % \begin{macro}{\AtBeginShipoutInit} % Compatibility only, we aren't delaying \ldots % \begin{macrocode} -\cs_set_eq:NN\AtBeginShipoutInit\@empty +\let \AtBeginShipoutInit \@empty % \end{macrocode} % \end{macro} - - - +% +% % \begin{macro}{\AtBeginShipout,\AtBeginShipoutNext} % Filling hooks % \begin{macrocode} -\newcommand\AtBeginShipout {\AddToHook{shipout/before}} -\newcommand\AtBeginShipoutNext {\AddToHookNext{shipout/before}} +\def \AtBeginShipout {\AddToHook{shipout/before}} +\def \AtBeginShipoutNext {\AddToHookNext{shipout/before}} % \end{macrocode} % \end{macro} - - - +% +% % \begin{macro}{\AtBeginShipoutFirst} % Slightly more complex as we need to know the name of the command under which the % \hook{shipout/firstpage} hook is filled. % \begin{macrocode} -\newcommand\AtBeginShipoutFirst{\@@_add_firstpage_material:Nn \AtBeginShipoutFirst} +\def \AtBeginShipoutFirst + {\@expl@@@shipout@add@firstpage@material@@Nn \AtBeginShipoutFirst} % \end{macrocode} % \end{macro} - - - -% This is somewhat different from the original where -% \cs{ShipoutBoxHeight} etc.\ only holds the \verb=\the\ht<box>= value. This -% may has some implications in some use cases and if that is a problem -% then it might need changing. -% -% \begin{macrocode} -\cs_new:Npn \ShipoutBoxHeight { \dim_use:N \l_shipout_box_ht_dim } -\cs_new:Npn \ShipoutBoxDepth { \dim_use:N \l_shipout_box_dp_dim } -\cs_new:Npn \ShipoutBoxWidth { \dim_use:N \l_shipout_box_wd_dim } -% \end{macrocode} - - +% +% % \begin{macro}{\AtBeginShipoutDiscard} % Just a different name. % \begin{macrocode} -\cs_new_eq:NN \AtBeginShipoutDiscard \DiscardShipoutBox +\let \AtBeginShipoutDiscard \DiscardShipoutBox % \end{macrocode} % \end{macro} - - +% +% % \begin{macro}{\AtBeginShipoutAddToBox,\AtBeginShipoutAddToBoxForeground, % \AtBeginShipoutUpperLeft,\AtBeginShipoutUpperLeftForeground} % We don't expose them. % \begin{macrocode} -\cs_new_eq:NN \AtBeginShipoutAddToBox \@@_add_background_box:n -\cs_new_eq:NN \AtBeginShipoutAddToBoxForeground \@@_add_foreground_box:n +\let \AtBeginShipoutAddToBox + \@expl@@@shipout@add@background@box@@n +\let \AtBeginShipoutAddToBoxForeground + \@expl@@@shipout@add@foreground@box@@n % \end{macrocode} % % \begin{macrocode} -\cs_new_eq:NN\AtBeginShipoutUpperLeft \@@_add_background_picture:n -\cs_new_eq:NN\AtBeginShipoutUpperLeftForeground \@@_add_foreground_picture:n +\let \AtBeginShipoutUpperLeft + \@expl@@@shipout@add@background@picture@@n +\let \AtBeginShipoutUpperLeftForeground + \@expl@@@shipout@add@foreground@picture@@n % \end{macrocode} % \end{macro} - % % -% We prevent the package \pkg{atbegshi} from loading: +% +% \begin{macro}{\ShipoutBoxHeight,\ShipoutBoxWidth,\ShipoutoBoxDepth} +% This is somewhat different from the original in \pkg{atbegshi} +% where \cs{ShipoutBoxHeight} etc.\ only holds the +% \verb=\the\ht<box>= value. This may has some implications in some +% use cases and if that is a problem then it might need changing. % \begin{macrocode} -\expandafter\cs_set_eq:NN\csname ver@atbegshi.sty\endcsname\fmtversion +\ExplSyntaxOn +\cs_new:Npn \ShipoutBoxHeight { \dim_use:N \l_shipout_box_ht_dim } +\cs_new:Npn \ShipoutBoxDepth { \dim_use:N \l_shipout_box_dp_dim } +\cs_new:Npn \ShipoutBoxWidth { \dim_use:N \l_shipout_box_wd_dim } +\ExplSyntaxOff % \end{macrocode} -% \pkg{hyperref} code (and \pkg{ltxcmds}) doesn't understand 2020-10-01 -% and thinks it is before 1994, so for now \ldots +% \end{macro} +% +% % \begin{macrocode} -\@namedef {ver@atbegshi.sty}{2020/10/01} +%</atbegshi-ltx> % \end{macrocode} - - - -% \subsection{Package \pkg{everyshi} emulation} % -% \begin{macro}{\EveryShipout,\AtNextShipout} -% This package has only two public commands to simulating it is easy: +% If the package is requested we substitute the one above: % \begin{macrocode} -\cs_new_eq:NN\EveryShipout\AtBeginShipout -\cs_new_eq:NN\AtNextShipout\AtBeginShipoutNext +%<*2ekernel> +\declare@file@substitution{atbegshi.sty}{atbegshi-ltx.sty} +%</2ekernel> % \end{macrocode} -% \end{macro} +% +% +% +% +% +% +% \subsection{Package \pkg{everyshi} emulation} % % \begin{macrocode} -\expandafter\cs_set_eq:NN\csname ver@everyshi.sty\endcsname\fmtversion -\@namedef {ver@everyshi.sty}{2020/10/01} +%<*everyshi-ltx> % \end{macrocode} - - - -% \subsection{Package \pkg{atenddvi} emulation} % -% \begin{macro}{\AtEndDvi} -% This package has only one public command to simulating it is easy: % \begin{macrocode} -\cs_new:Npn \AtEndDvi {\AddToHook{shipout/lastpage}} +\ProvidesPackage{everyshi} + [2020/08/17 v1.0a + Emulation of the original everyshi package^^Jwith kernel methods] +% \end{macrocode} +% +% \begin{macro}{\EveryShipout,\AtNextShipout} +% This package has only two public commands so simulating it is easy: +% \begin{macrocode} +\def \EveryShipout {\AddToHook{shipout/before}} +\def \AtNextShipout {\AddToHookNext{shipout/before}} % \end{macrocode} % \end{macro} % +% \begin{macrocode} +% This is one difference between \pkg{everyshi} and the kernel +% implementation, the latter does not directly use box 255. +% +% For usage by ordinary users this makes no difference but of a +% package use complicated code together with \pkg{everyshi} and +% directly manipulates box 255 then this package needs updating. +% In most cases the updates are simple because the kernel offers +% hooks that makes such complicated code unnecessary. % +% We therefore add a little file into the adjusted package % \begin{macrocode} -\expandafter\cs_set_eq:NN\csname ver@atenddvi.sty\endcsname\fmtversion -\@namedef {ver@atenddvi.sty}{2020/10/01} +%% +%% In normal circumstances the above emulation is sufficient and in +%% all known packages (we know of) that use everyshi it either works or +%% the packages have been adjusted. +%% +%% Code that directly manipulates box 255, however, might fail. +%% If that is the case look at the shipout hooks offered now as +%% they are normally sufficienct to avoid such minpulations (or +%% replace box 255 with \ShipoutBox in the code. +%% +%</everyshi-ltx> % \end{macrocode} - - - - +% +% +% If the package is requested we substitute the one above: % \begin{macrocode} -\ExplSyntaxOff +%<*2ekernel> +\declare@file@substitution{everyshi.sty}{everyshi-ltx.sty} %</2ekernel> % \end{macrocode} - +% +% +% Rather important :-) +% \begin{macrocode} +%<@@=> +% \end{macrocode} +% % \Finale % - - +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - |