% \iffalse meta-comment
%
%% File: output-patches.dtx (C) Copyright 2020-2021 Frank Mittelbach
%
% 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
%
%    https://www.latex-project.org/lppl.txt
%
%<*driver>
\documentclass{l3doc}

\EnableCrossrefs
\CodelineIndex
\begin{document}
  \DocInput{output-patches-tmp-ltx.dtx}
\end{document}
%</driver>
%
% \fi
%
% \providecommand\hook[1]{\texttt{#1}}
%
%
%
% \title{Temporary output patches for tagging and better link support}
% \author{Frank Mittelbach \and Ulrike Fischer}
%
% \maketitle
%
% \section{Introduction}
%
%    This package contains a few patches of internal \LaTeX{} needed
%    to support paragraph tagging across
%    page boundaries (in \pdfTeX) and improve the behaviour of links across page breaks.
%
%    Until this get properly integrated with the kernel code this has
%    to be taken as a prototype and code, interfaces as well as
%    behavior may change without notice and certainly without any
%    backwards compatibility!
%
%
% \StopEventually{\setlength\IndexMin{200pt}  \PrintIndex  }
%
%
% \section{The Implementation}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesPackage{output-patches-tmp-ltx}
        [2021-08-20 v0.95 Temporary patches of output commands]
\RequirePackage{etoolbox}
%    \end{macrocode}
%
%
%  \subsection{Patching the OR}
%  This add hooks around header and footer, in \cs{@makecol} and in multicol.
%  At first initialize some of the hooks. We use providecommand to avoid problems if
%  the kernel changes here and provides them directly.
%    \begin{macrocode}
\providecommand\@kernel@before@head{}
\providecommand\@kernel@before@foot{}
\providecommand\@kernel@after@head{}
\providecommand\@kernel@after@foot{}
\providecommand\@mult@ptagging@hook{}% multicol
%    \end{macrocode}
%
%    \begin{macrocode}

\patchcmd\@outputpage
 {\vfil\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox}
 {\vfil\@kernel@before@head\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox\@kernel@after@head}
 {\typeout{Patching header in \string\@outputpage}}{\PATCHerror }


\patchcmd\@outputpage
 {\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox}
 {\@kernel@before@foot\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox\@kernel@after@foot}
 {\typeout{Patching footer in \string\@outputpage}}{\PATCHerror }
%    \end{macrocode}
%
%  \begin{macro}{\@makecol}
%    We have to patch \cs{@makecol} in two places:
%    \begin{itemize}
%    \item
%      update 255 up front to add missing tmb/tme if necessary
%    \item
%      update the \cs{footins} stream if that one got split
%    \end{itemize}
%
%   If the new latex-lab file for the output routine is loaded it will do the right thing.
%   In the other case we patch \cs{@makecol} manually.
%    \begin{macrocode}
\@ifpackageloaded{latex-lab-testphase-new-or}
   {}
   {
    \providecommand\@kernel@before@footins{}
    \providecommand\@kernel@before@cclv{}

    \patchcmd\@makecol
      {\vskip\skip\footins}
      {\vskip\skip\footins\@kernel@before@footins}
      {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }

% for some reason patching with etoolbox only works in this order ...

    \pretocmd\@makecol{\@kernel@before@cclv}
     {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
   }
%    \end{macrocode}
%  \end{macro}
%
% \subsection{\pkg{multicol} adjustments}
%
%    The patches for pkg{multicol} are fairly minimal:
%    \begin{itemize}
%    \item At the start of the environment anything already on the
%    page is picked up and stored in \cs{partial@page}, we may need to add
%    a TMB to that (it should have a proper TME). This has to happen
%    in the \enquote{main} stream context.
%    \item
%    \item
%    \end{itemize}
%
%    \begin{macrocode}
\AddToHook{package/multicol/after}
    {% multicol needs later loading
%    \end{macrocode}
%
%    \begin{macrocode}
  \patchcmd\page@sofar
      {\setbox\z@\hbox{p}\global\dimen\tw@\dp\z@}%
      {%
        \setbox\z@\hbox{p}\global\dimen\tw@\dp\z@
        \@mult@ptagging@hook
      }%
      {\typeout{Patching \string\page@sofar\space for tagging}}{\PATCHerror}%
}
%    \end{macrocode}
%
% \subsection{Interrupt hooks}
% This requires the l3pdfannot module!
% We add the code here an not in hyperref, as it should also work with links
% created directly with the l3pdfannot commands. The file is only
% loaded by the pdfmanagement, so no need to test if the commands exist.
%    \begin{macrocode}
\ExplSyntaxOn
\def\@kernel@before@head{\pdfannot_link_off:}
\def\@kernel@before@foot{\pdfannot_link_off:}
\def\@kernel@after@head {\pdfannot_link_on:}
\def\@kernel@after@foot {\pdfannot_link_on:}
\ExplSyntaxOff
%    \end{macrocode}
%
%    \begin{macrocode}
\endinput
%</package>
%    \end{macrocode}
%
% \Finale
%
