%D \module
%D   [       file=page-sid,
%D        version=2000.10.20,
%D          title=\CONTEXT\ Page Macros,
%D       subtitle=Side Floats,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Page Macros / Side Floats}

\unprotect

% problem: when too small, side effects; we need to determine the
% shift earlier so that we can act when shift < size
%
% \definefloat[edgefigure]
% \setupfloat
%     [edgefigure]
%     [rightmargindistance=-\rightmargintotal,
%      leftmargindistance=-\rightmargintotal,
%      default=outer]
% \starttext
% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
% \stoptext

% todo: dimexpr an dnumexpr

% These macro deal with side floats. We started with Daniel
% Comenetz macros as published in TUGBoat Volume 14 (1993),
% No.\ 1: Anchored Figures at Either Margin. I extended and
% patched the macros to suite our needs which results in a
% messy module. Therefore, this module badly needs an update
% because it's now a mixture of old and new macros.

% afhankelijke variabelen
%
% \overgap    vervangen door   \floatsidetopskip
% \sidegap    vervangen door   \floatsideskip
% \undergap   vervangen door   \floatsidebottomskip
%
% \prskp      vervangen door   \ctxparskip

% toegevoegde macro's/aanroepen
%
% \logsidefloat       : loginformatie
% \flushsidefloats    : nodig voor koppen

% recente wijzigingen:
%
% namen aangepast: \float... enz. i.p.v. \pic

% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
% begint de tekst terecht wat lager.

\newdimen\sidefloatheight      % includes the topskip
\newdimen\sidefloatwidth
\newdimen\sidefloathsize
\newdimen\sidefloatshift
\newdimen\sidefloatextrashift
\newdimen\sidefloatvsize       \def\nofloatvsize{-1pt }
\newdimen\sidefloatprogress
\newdimen\sidefloatpagetotal

\newbox\floatbottom

\newcount\sidefloatsidelines
\newcount\sidefloatlinesdone

% 1 = backspace
% 2 = leftedge
% 3 = leftmargin
% 4 = leftside
% 5 = rightside
% 6 = rightmargin
% 7 = rightedge
% 8 = cutspace

\chardef\sidefloattype\zerocount

\def\backspacefloat    {\global\chardef\sidefloattype1 \putsidefloat}
\def\leftedgefloat     {\global\chardef\sidefloattype2 \putsidefloat}
\def\leftmarginfloat   {\global\chardef\sidefloattype3 \putsidefloat}
\def\leftfloat         {\global\chardef\sidefloattype4 \putsidefloat}
\def\rightfloat        {\global\chardef\sidefloattype5 \putsidefloat}
\def\rightmarginfloat  {\global\chardef\sidefloattype6 \putsidefloat}
\def\rightedgefloat    {\global\chardef\sidefloattype7 \putsidefloat}
\def\cutspacefloat     {\global\chardef\sidefloattype8 \putsidefloat}

\let\marginfloat       \cutspacefloat

\newif\ifroomforfloat
\newif\iffloatshort
\newif\iffloatflag
\newif\iffloatrighteqo
\newif\iffloatlefteqo

\newdimen\sidefloatleftskip
\newdimen\sidefloatrightskip
\newdimen\sidefloatmaximum

% \def\checksidefloatshift
%   {\ifdim\sidefloatmaximum>\zeropoint
%      \ifcase\sidefloattype
%        % invalid
%      \or
%        % backspace
%      \or
%        \global\sidefloatshift-\sidefloatmaximum
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
%      \or
%        \global\sidefloatshift-\sidefloatmaximum
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
%      \or
%        % left
%      \or
%        % right
%      \or
%        \global\sidefloatshift-\sidefloatmaximum
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
%      \or
%        \global\sidefloatshift-\sidefloatmaximum
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
%      \or
%        % cutspace
%      \fi
%    \fi}

\def\checksidefloatshift
  {\ifdim\sidefloatmaximum>\zeropoint
     \ifcase\sidefloattype
       % invalid
     \or
       % backspace
     \or
       \global\sidefloatshift\dimexpr
         -\sidefloatmaximum
         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
         -\rightorleftpageaction \leftmargindistance \rightmargindistance
         -\compensatedinnermakeupmargin
       \relax
     \or
       \global\sidefloatshift\dimexpr
         -\sidefloatmaximum
         -\rightorleftpageaction \leftmargindistance \rightmargindistance
         -\compensatedinnermakeupmargin
       \relax
     \or
       % left
     \or
       % right
     \or
       \global\sidefloatshift\dimexpr
         -\sidefloatmaximum
         -\rightorleftpageaction \leftmargindistance \rightmargindistance
         -\compensatedinnermakeupmargin
       \relax
     \or
       \global\sidefloatshift\dimexpr
         -\sidefloatmaximum
         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
         -\rightorleftpageaction \leftmargindistance \rightmargindistance
         -\compensatedinnermakeupmargin
       \relax
     \or
       % cutspace
     \fi
   \fi}

% \def\setsidefloatskips
%   {\global\sidefloatrightskip\zeropoint
%    \global\sidefloatleftskip \zeropoint
%    \ifcase\sidefloattype
%    \or % backspace
%      \global        \sidefloatleftskip \rightorleftpageaction \backspace \cutspace
%    \or % leftedge
%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth
%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance
%    \or % leftmargin
%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
%    \or % leftside
%    \or % rightside
%    \or % rightmargin
%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
%    \or % rightedge
%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth
%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance
%    \or % cutspace
%      \global        \sidefloatrightskip\rightorleftpageaction \cutspace\backspace
%    \fi
%    \ifdim\sidefloatrightskip>\zeropoint
%      \doglobal\advance\sidefloatrightskip\rightskip
%    \fi
%    \ifdim\sidefloatleftskip>\zeropoint
%      \doglobal\advance\sidefloatleftskip\leftskip
%    \fi}


% use \outermarginwidth etc here

\def\setsidefloatskips
  {\global\sidefloatrightskip\zeropoint
   \global\sidefloatleftskip \zeropoint
   \ifcase\sidefloattype
   \or % backspace
     \global\sidefloatleftskip\dimexpr
       +\rightorleftpageaction \backspace           \cutspace
       +\compensatedinnermakeupmargin
     \relax
   \or % leftedge
     \global\sidefloatleftskip\dimexpr
       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
       +\rightorleftpageaction \leftmarginwidth     \rightmarginwidth
       +\rightorleftpageaction \leftedgedistance    \rightedgedistance
       +\compensatedinnermakeupmargin
     \relax
   \or % leftmargin
     \global\sidefloatleftskip\dimexpr
       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
       +\compensatedinnermakeupmargin
     \relax
   \or % leftside
   \or % rightside
   \or % rightmargin
     \global\sidefloatrightskip\dimexpr
       +\rightorleftpageaction \rightmargindistance \leftmargindistance
       +\compensatedinnermakeupmargin
     \relax
   \or % rightedge
     \global\sidefloatrightskip\dimexpr
       +\rightorleftpageaction \rightmargindistance \leftmargindistance
       +\rightorleftpageaction \rightmarginwidth    \leftmarginwidth
       +\rightorleftpageaction \rightedgedistance   \leftedgedistance
       +\compensatedinnermakeupmargin
     \relax
   \or % cutspace
     \global\sidefloatrightskip\dimexpr
       +\rightorleftpageaction \cutspace            \backspace
       +\compensatedinnermakeupmargin
     \relax
   \fi
   \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
   \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip  \fi}

% eq is still crap

\ifx\normalleqno\undefined

  \let\floatrighteqo=\eqno
  \let\floatleftleqo=\leqno

\else

  \let\floatrighteqo=\normaleqno
  \let\floatleftleqo=\normalleqno

\fi

% Watch it even more! In inner, gaat't mis omdat daar
% pagetotal enz niet zijn aangepast. Inner kan overigens niet
% betrouwbaar worden getest!

% \def\flushsidefloats%
%   {\par
%    \sidefloatprogress=\sidefloatvsize
%    \advance\sidefloatprogress by -\pagetotal
%    \ifdim\sidefloatprogress>\zeropoint
%      \witruimte % nog checken op interferentie
%      \kern\sidefloatprogress
%    \fi
%    \global\sidefloatvsize=\nofloatvsize
%    \global\floatflagfalse}
%
% no, too buggy, leads to top of page crap
%
%\def\flushsidefloats
%  {\par
%   \dochecksidefloat
%   \scratchcounter=-\hangafter
%   \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
%
%\def\flushsidefloats
%  {\par
%   \!!heighta\sidefloatvsize
%   \advance\!!heighta -\pagetotal
%   \ifdim\!!heighta>\zeropoint
%     % to be checked for interference
%     \witruimte
%     % will be option
%     \getnoflines\!!heighta
%     \!!heighta\noflines\lineheight
%     % so far for option
%     \kern\!!heighta
%   \fi
%   % == \forgetsidefloats
%   \global\sidefloatvsize\nofloatvsize
%   \global\floatshortfalse
%   \global\floatflagfalse}

% \def\flushsidefloats
%   {\par
%    \!!heighta\sidefloatvsize
%    \advance\!!heighta -\pagetotal
%    \ifdim\!!heighta>\zeropoint
%      % to be checked for interference
%      \witruimte
%      % will be option
%      \getnoflines\!!heighta
%      \!!heighta\noflines\lineheight
%      % so far for option
%      \ifdim\sidefloatbottomskip>\zeropoint\relax
%        \ifdim\!!heighta>\sidefloatbottomskip
%          \advance\!!heighta-\sidefloatbottomskip
%          \kern\!!heighta
%          \vskip\sidefloatbottomskip
%        \else
%          \kern\!!heighta
%        \fi
%      \else
%        \kern\!!heighta
%      \fi
%    \fi
%    % == \forgetsidefloats
%    \global\sidefloatvsize\nofloatvsize
%    \global\floatshortfalse
%    \global\floatflagfalse}

\newif\iftracesidefloats

\def\flushsidefloats
  {\par
   \!!heighta\sidefloatvsize
   \advance\!!heighta -\pagetotal
   \ifnum\!!heighta>\zeropoint
     \global\advance\sidefloatvsize -\sidefloatbottomskip
     \ifdim\!!heighta>\zeropoint
       \bgroup
       \let\flushsidefloats\relax
       \forgetall
       \doloop
         {\strut
          \iftracesidefloats
            \color[darkgray]%
              {\baselinerulefalse
               \boxrulewidth.5\points
               \ruledhbox{\strut\kern\sidefloatwidth}}%
          \fi
          \par
          \!!heighta\sidefloatvsize
          \advance\!!heighta -\pagetotal
          \ifdim\!!heighta>\zeropoint
            \ifnum\recurselevel>\plushundred
              \exitloop
            \fi
          \else
            \exitloop
          \fi}%
       \egroup
       \ifdim\parskip>\zeropoint
         \ifdim\sidefloatbottomskip>\parskip
           \nowhitespace
           \vskip\sidefloatbottomskip
         \fi
       \fi
     \else\ifdim\sidefloatbottomskip>\parskip
       \vskip\sidefloatbottomskip
     \fi\fi
   \fi
   % not entirely the same as \forgetsidefloats
   \global\sidefloatvsize\nofloatvsize
   % \global\sidefloatsidelines\zerocount % no, we flush before a side float
   \global\floatshortfalse                % so this will get lost
   % also here if used at all \global\holdinginserts\zerocount
   \global\floatflagfalse}

\def\flushsidefloatsafterpar
  {\xdef\oldpagetotal{\the\pagetotal}%
   \gdef\checksidefloat
     {\dochecksidefloat
      \ifdim\oldpagetotal=\pagetotal \else
        \global\let\checksidefloat\dochecksidefloat
        \flushsidefloats
        \global\sidefloatsidelines\zerocount % here !
      \fi}}

\def\forgetsidefloats
  {\global\sidefloatvsize\nofloatvsize
   \global\sidefloatsidelines\zerocount
   % also here if used at all \global\holdinginserts\zerocount
   \global\floatshortfalse
   \global\floatflagfalse}

\let\logsidefloat=\relax

\def\pushpenalties % needed ? and right
  {\widowpenalty\plusone
   \clubpenalty\plustwo
   \brokenpenalty\plusone
   \let\pushpenalties\relax
   \edef\poppenalties
     {\widowpenalty \the\widowpenalty
      \clubpenalty  \the\clubpenalty
      \brokenpenalty\the\brokenpenalty
      \let\poppenalties\relax}}

% shouldn;t that be:
%
% \def\pushpenalties % needed?
%   {\let\pushpenalties\relax
%    \edef\poppenalties
%      {\widowpenalty \the\widowpenalty
%       \clubpenalty  \the\clubpenalty
%       \brokenpenalty\the\brokenpenalty
%       \let\poppenalties\relax}%
%    \widowpenalty\plusone
%    \clubpenalty\plustwo
%    \brokenpenalty\plusone}

\let\poppenalties=\relax

\def\restorepenalties
  {\ifnum\outputpenalty=\!!tenthousand\else
     \penalty\outputpenalty
   \fi}

\def\sidefloatoutput
  {\iffloatshort
     \unvbox\normalpagebox
     \setbox\floatbottom\lastbox
     \ifdim\wd\floatbottom>\sidefloathsize
       \penalty-201
       \box\floatbottom
     \else
       \ifvoid\floatbottom
       \else
         \restoreleftindent
         \ifdim\wd\floatbottom<\sidefloathsize
           \parskip\zeropoint
           %\noindent
           \ifinner\else\vadjust{\penalty\minusone}\fi
           \iffloatlefteqo
             \global\floatlefteqofalse
           \else
             \global\advance\sidefloathsize -\wd\floatbottom
             \iffloatrighteqo
               \global\floatrighteqofalse
             \else
               \global\divide\sidefloathsize \plustwo
             \fi
             \hskip\sidefloathsize
           \fi
         \fi
         \box\floatbottom
         \restorepenalties
       \fi
     \fi
     % why was this \global\holdinginserts\zerocount
     \global\floatshortfalse
   \else
     \finalsidefloatoutput % new
     \global\sidefloatvsize\nofloatvsize
     \global\sidefloatsidelines\zerocount
     % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
     \poppenalties
   \fi}

\def\finalsidefloatoutput% new
  {\finaloutput\unvbox\normalpagebox}

\def\restoreleftindent
  {\relax \ifnum\sidefloattype>4 \else
     \parskip\zeropoint % here ?
     \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
       \noindent
       \ifinner\else\vadjust{\penalty\minusone}\fi
       \hskip\sidefloatwidth
    %\else
    %  we have a margin or edge float
     \fi
   \fi}

\ifx\normaleqno\undefined

  \def\normaleqno
    {\iffloatshort
       \global\floatrighteqotrue
     \fi
     \floatrighteqo}

\else

  \def\eqno
    {\iffloatshort
       \global\floatrighteqotrue
     \fi
     \floatrighteqo}

\fi

% externfiguur     -> grid        =ja|hoogte|diepte|halveregel|passend -> helemaal in details
% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'

% replacement for below
%
%    \global\setbox\floatbox\hbox % no \hskip, but \kern here
%      {\ifcase\sidefloattype
%         \vbox{#1}%
%       \or % 1
%         \hskip\sidefloatleftshift
%         \hskip\sidefloatshift
%         \vbox{#1}%
%         \kern-\sidefloatextrashift
%       \or % 2
%         \hskip\sidefloatshift
%         \vbox{#1}%
%         \kern-\sidefloatextrashift
%       \or % 3
%         \hskip\sidefloatshift
%         \vbox{#1}%
%         \kern-\sidefloatextrashift
%       \or % 4
%         \hskip\sidefloatleftshift
%         \hskip\sidefloatshift
%         \vbox{#1\removedepth}%
%         \kern-\sidefloatextrashift
%       \or % 5
%         \hskip-\sidefloatextrashift
%         \vbox{#1}%
%         \kern\sidefloatshift
%         \kern\sidefloatrightshift
%       \or % 6
%         \hskip-\sidefloatextrashift
%         \vbox{#1}%
%         \kern\sidefloatshift
%       \or % 7
%         \hskip-\sidefloatextrashift
%         \vbox{#1}%
%         \kern\sidefloatshift
%       \or % 8
%         \hskip-\sidefloatextrashift
%         \vbox{#1}%
%         \kern\sidefloatshift
%         \kern\sidefloatrightshift
%       \fi}%
%
% keep this ^

\def\putsidefloat#1% grid (4) is rather experimental
  {\par
   \whitespace
   % moved here dec 2001
   {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
   \checksidefloatshift
   \ifdim\sidefloatshift=\zeropoint \relax
     \ifnum\sidefloattype=4
       \global\advance\sidefloatshift\sidefloatextrashift
       \global\sidefloatextrashift\zeropoint
     \else\ifnum\sidefloattype=5
       \global\advance\sidefloatshift\sidefloatextrashift
       \global\sidefloatextrashift\zeropoint
     \fi\fi
   \else
     \ifnum\sidefloattype<4
       \global\chardef\sidefloattype4
     \else\ifnum\sidefloattype>5
       \global\chardef\sidefloattype5
     \fi\fi
   \fi
   \previoussidefloat
   \stallsidefloat
  %\global\setbox\floatbox\hbox
  %  {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi
  %   \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi
  %   \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
  %   \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi
  %   \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}%
   \global\setbox\floatbox\hbox % no \hskip, but \kern here
     {\ifnum\sidefloattype=4
        \hskip\sidefloatleftshift
      \else\ifnum\sidefloattype=1
        \hskip\sidefloatleftshift
      \fi\fi
      \ifnum\sidefloattype>4
        \hskip-\sidefloatextrashift
      \else
        \hskip\sidefloatshift
      \fi
      \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
      \ifnum\sidefloattype>4
        \kern\sidefloatshift
      \else
        \kern-\sidefloatextrashift
      \fi
      \ifnum\sidefloattype=8
        \kern\sidefloatrightshift
      \else\ifnum\sidefloattype=5
        \kern\sidefloatrightshift
      \fi\fi}%
   \ifnum\sidefloatalign=4
     \getnoflines{\ht\floatbox}%
     \scratchdimen\noflines\lineheight
     \advance\scratchdimen-\strutdepth
     \getrawnoflines\sidefloattopskip
     \advance\scratchdimen\noflines\lineheight
     % todo: maybe rounding problem here
     % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
     \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
     \ht\floatbox\scratchdimen
     \dp\floatbox\zeropoint
   \fi
   \ifcase\sidefloatalign \else
     \global\sidefloattopskip\zeropoint
   \fi
   \scratchdimen
     \ifnum\sidefloattype<4
       \sidefloattopskip
     \else\ifnum\sidefloattype>5
       \sidefloattopskip
     \else
       \zeropoint
     \fi\fi
   % the top of the box is at the previous baseline
   \ifcase\sidefloatalign
       % 0 normal
     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
   \or % 1 height
     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
   \or % 2 line
   \or % 3 depth
     \advance\scratchdimen\lineheight
     \advance\scratchdimen\strutdepth
   \or % 4 grid
     \scratchdimen\zeropoint
   \or
     \advance\scratchdimen\strutheight
   \fi
   % new
   \global\sidefloatlinesdone\zerocount
   \ifnum\sidefloatsidelines>\zerocount
     \advance\scratchdimen\sidefloatsidelines\lineheight
   \fi
   % new
   \global\setbox\floatbox\hbox
     {\vbox
        {\vskip\scratchdimen
         \nointerlineskip
         \box\floatbox
         \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}%
   \ifnum\sidefloattype<4
     \global\sidefloattopskip\zeropoint
   \else\ifnum\sidefloattype>5
     \global\sidefloattopskip\zeropoint
   \fi\fi
   \global\sidefloatdownshift\zeropoint
   \measuresidefloat
   \ifroomforfloat \else
     \tosssidefloat
     \measuresidefloat
     \stallsidefloat
   \fi
   \setsidefloat}

\def\progresssidefloat
  {\sidefloatprogress\sidefloatvsize
   \iffloatflag
     \advance\sidefloatprogress -\sidefloatpagetotal
     \global\floatflagfalse
   \else
     \advance\sidefloatprogress -\pagetotal
   \fi}

\def\tosssidefloat
  {\vfill\eject}

\def\measuresidefloat
  {\global\floatflagtrue
   \global\sidefloatpagetotal \pagetotal % global
   \ifnum\sidefloattype<4
     \global        \sidefloatwidth \zeropoint
   \else\ifnum\sidefloattype>5
     \global        \sidefloatwidth \zeropoint
   \else
     \global        \sidefloatwidth \wd\floatbox
     \global\advance\sidefloatwidth \floatsideskip
   \fi\fi
   \ifdim\sidefloatwidth<\zeropoint
     \global\sidefloatwidth\zeropoint
   \fi
   \global        \sidefloathsize  \hsize
   \global\advance\sidefloathsize -\sidefloatwidth
   \global        \sidefloatheight \ht\floatbox
   \global\advance\sidefloatheight \dp\floatbox
   \global\advance\sidefloatheight \sidefloattopskip
   \global        \sidefloatvsize  \sidefloatheight
   \global\advance\sidefloatvsize  \sidefloatpagetotal
   \dimen0\sidefloatvsize
   \dimen2\pagegoal
   \relax
   \ifcase\sidefloatmethod
     % method 0 : raw
   \or
     % method 1 : safe
     \dimen2 .99\pagegoal
   \or
     % method 2 : tight
     \advance\dimen0 -\onepoint
   \fi
   \relax % really needed ! ! ! !
   \ifdim\dimen0>\dimen2
     \global\roomforfloatfalse
   \else
     \dimen0=\pagegoal
     \advance\dimen0 -\sidefloatvsize
     \ifdim\dimen0<\sidefloatbottomskip
       \global\advance\sidefloatvsize \dimen0
       \global\floatshorttrue
       \pushpenalties
       % why was this \global\holdinginserts\plusone
     \else
       \global\advance\sidefloatvsize \sidefloatbottomskip
       \global\floatshortfalse
     \fi
     \global\roomforfloattrue
   \fi}

\def\setsidefloat% nilling everypar saves time and redudant pos's
  {% removed here dec 2001
   % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
   \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi
   \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi
   \edef\presidefloatdepth{\the\prevdepth}%
   \nointerlineskip
   \bgroup
   \everypar\emptytoks
   \parskip\zeropoint
  %\checksidefloatshift
   \setsidefloatskips
   \logsidefloat
   \relax
   \ifcase\sidefloattype
     % invalid
   \or % backspace
     \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
   \or % leftedge
     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
   \or % leftmargin
     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
   \or % leftside
     \noindent\box\floatbox\hfill
   \or % rightside
     \hfill\box\floatbox
   \or % rightmargin
     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
   \or % rightedge
     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
   \or % cutspace
     \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
   \fi
   \egroup
   \par
   \kern-\sidefloatheight
   \penalty10001 % oeps, this will change
   \normalbaselines
   \prevdepth\presidefloatdepth
   % \noindent
   \resetsidefloatparagraph
   \ignorespaces} % not really needed

\newcount\sidefloatparagraph

\def\iffirstsidefloatparagraph
  {\ifcase\sidefloatparagraph\or}

% without sidefloat lines
%
% \def\setsidefloatparagraph
%   {%\advance\sidefloatprogress \sidefloatbottomskip
%    %\!!counta\sidefloatprogress
%    \scratchdimen\sidefloatprogress
%    \advance\scratchdimen \strutht
%    \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
%    \!!counta\scratchdimen
%    \divide\!!counta \baselineskip
%    \ifnum\!!counta>0
%      \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
%      \hangafter-\!!counta
%    \fi
%    \global\advance\sidefloatparagraph \plusone
%    \iftracesidefloats
%      \hskip-\sidefloatwidth
%      \color[darkgray]%
%        {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
%        %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
%         \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
%    \fi}

\def\setsidefloatparagraph
  {%\advance\sidefloatprogress \sidefloatbottomskip
   %\!!counta\sidefloatprogress
   \scratchdimen\sidefloatprogress
   \advance\scratchdimen \strutht
   \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
   \!!counta\scratchdimen
   \divide\!!counta \baselineskip\relax
   \ifnum\!!counta>0
     % new from here
     \ifcase\sidefloatsidelines\else
       \ifcase\sidefloatlinesdone
         \global\sidefloatlinesdone\!!counta
       \else
         \scratchcounter\sidefloatlinesdone
         \advance\scratchcounter-\!!counta
         \global\advance\sidefloatsidelines-\scratchcounter
       \fi
     \fi
     \ifnum\sidefloatsidelines>\zerocount
       \scratchtoks\emptytoks
       \scratchcounter\sidefloatsidelines
       \scratchdimen\hsize
       \advance\scratchdimen-\sidefloatwidth
       \dorecurse\sidefloatsidelines
         {\appendtoks \zeropoint \hsize \to \scratchtoks}%
       \ifnum\!!counta>\sidefloatsidelines
         \advance\!!counta -\sidefloatsidelines\relax
         \advance\scratchcounter\!!counta
         \dorecurse\!!counta
           {\ifnum\sidefloattype>4
              \appendtoks \zeropoint \scratchdimen \to \scratchtoks
            \else
              \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
            \fi}%
       \fi
       \advance\scratchcounter \plusone
       \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
     \else
       % new till here
       \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
       \hangafter-\!!counta
     \fi
   \fi
   \global\advance\sidefloatparagraph \plusone
   \iftracesidefloats
     \hskip-\sidefloatwidth
     \color[darkgray]%
       {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
       %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
        \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
   \fi}

\def\resetsidefloatparagraph
  {\global\sidefloatparagraph\zerocount }

\def\dochecksidefloat
  {\progresssidefloat
   \ifdim\sidefloatprogress>\zeropoint
     \setsidefloatparagraph
   \else
     \resetsidefloatparagraph
   \fi
   \parskip\ctxparskip}

\def\checksidefloat
  {\dochecksidefloat}

\def\synchronizesidefloats
  {\ifinner \else \checksidefloat \fi}

\def\doadjustsidefloatdisplaylines
  {\par
   \vskip-\parskip
   \noindent
   \ignorespaces}

\def\adjustsidefloatdisplaylines
  {\aftergroup\doadjustsidefloatdisplaylines}

\def\previoussidefloat
  {\progresssidefloat
   \ifdim\sidefloatprogress>\zeropoint \relax
     \iffloatshort
       \global\floatshortfalse
       \tosssidefloat
     \else
       \kern\sidefloatprogress
     \fi
   \fi}

\def\stallsidefloat
  {\!!counta\pageshrink
   \divide\!!counta \baselineskip
   \advance\!!counta \plusone
   \parskip\zeropoint
   \dorecurse\!!counta{\line{}}%
   \kern-\!!counta\baselineskip
   \penalty\zerocount }

% We need to hook it into the other otr's. This code will move.

\let\OTRONEflushsidefloats      \flushsidefloats
\let\OTRONEsynchronizesidefloats\synchronizesidefloats

% page-set
%
% \let\OTRSETflushsidefloats      \forgetsidefloats
% \let\OTRSETsynchronizesidefloats\forgetsidefloats

% page-mul
%
% \let\OTRMULflushsidefloats      \forgetsidefloats
% \let\OTRMULsynchronizesidefloats\forgetsidefloats

\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
\def\flushsidefloats      {\OTRcommand\flushsidefloats}

\protect \endinput
