\NeedsTeXFormat{LaTeX2e}[2015/12/01]
\ProvidesPackage{stfloats}
[2025/06/18 v3.4 Improve float mechanism and baselineskip settings]
\newif\if@kernel@version@MMXXV
\@ifundefined{@makespecialcolbox}{\@kernel@version@MMXXVtrue}{}
\gdef\@dblbotlist{}
\newcount\@dblbotnum
\newcount\c@dblbotnumber
\@defaultunits\expandafter\c@dblbotnumber\fmtversion\relax\@nnil
\ifnum\c@dblbotnumber<2015\relax
\@latex@error{Too old LaTeX format (<2015)!\MessageBreak
Update LaTeX system!}\@ehd
\fi
\setcounter{dblbotnumber}{2}
\def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tbp]}}
\g@addto@macro\@dblfloatplacement{\global\@dblbotnum\c@dblbotnumber}
\def\@addtodblcol{
\begingroup
\@insertfalse
\@setfloattypecounts
\@getfpsbit \tw@
\ifodd\@tempcnta
\@flsetnum \@dbltopnum
\ifnum \@dbltopnum>\z@
\@tempswafalse
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\else
\ifnum \@fpstype<\sixt@@n
\advance \@dbltoproom \@textmin
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\fi
\advance \@dbltoproom -\@textmin
\fi
\fi
\if@tempswa
\@bitor \@currtype \@deferlist
\@testwrongwidth\@currbox
\if@test
\else
\@bitor \@currtype \@dblbotlist
\if@test
\else
\@tempdima -\ht\@currbox
\advance\@tempdima
-\ifx \@dbltoplist\@empty \dbltextfloatsep \else
\dblfloatsep \fi
\global \advance \@dbltoproom \@tempdima
\global \advance \@colht \@tempdima
\global \advance \@dbltopnum \m@ne
\@cons \@dbltoplist \@currbox
\@inserttrue
\fi
\fi
\fi
\fi
\fi
\if@insert
\else
\@getfpsbit 4\relax
\ifodd\@tempcnta
\@flsetnum \@dblbotnum
\ifnum \@dblbotnum>\z@
\@tempswafalse
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\else
\ifnum \@fpstype<\sixt@@n
\advance \@dbltoproom \@textmin
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\fi
\advance \@dbltoproom -\@textmin
\fi
\fi
\if@tempswa
\@bitor \@currtype \@deferlist
\@testwrongwidth\@currbox
\if@test
\else
\@tempdima -\ht\@currbox
\advance\@tempdima
-\ifx \@dblbotlist\@empty \dbltextfloatsep \else
\dblfloatsep \fi
\global \advance \@dbltoproom \@tempdima
\global \advance \@colht \@tempdima
\global \advance \@dblbotnum \m@ne
\@cons \@dblbotlist \@currbox
\@inserttrue
\fi
\fi
\fi
\fi
\if@insert
\else
\@cons\@deferlist\@currbox
\fi
\fi
\endgroup
}
\def\@addtocurcol{
\@insertfalse
\@setfloattypecounts
\ifnum \@fpstype=8
\else
\ifnum \@fpstype=24
\else
\@flsettextmin
\advance \@textmin \@textfloatsheight
\@reqcolroom \@pageht
\ifdim \@textmin>\@reqcolroom
\@reqcolroom \@textmin
\fi
\advance \@reqcolroom \ht\@currbox
\if@kernel@version@MMXXV \saved@reqcolroom \@reqcolroom\fi
\ifdim \@colroom>\@reqcolroom
\@flsetnum \@colnum
\ifnum \@colnum>\z@
\@bitor\@currtype\@deferlist
\if@test
\else
\@testwrongwidth\@currbox
\if@test
\if@firstcolumn
\@getfpsbit \tw@
\ifodd\@tempcnta
\@flsetnum \@dbltopnum
\ifnum \@dbltopnum>\z@
\@tempswafalse
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\else
\ifnum \@fpstype<\sixt@@n
\advance \@dbltoproom \@textmin
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\fi
\advance \@dbltoproom -\@textmin
\fi
\fi
\if@tempswa
\@bitor\@currtype{\@toplist\@midlist\@botlist\@dblbotlist}
\if@test
\else
\@tempdima -\ht\@currbox
\advance\@tempdima
-\ifx \@dbltoplist\@empty \dbltextfloatsep \else
\dblfloatsep \fi
\global \advance \@dbltoproom \@tempdima
\global \advance \@colht \@tempdima
\global \advance \@colroom \@tempdima
\global \advance \@dbltopnum \m@ne
\@cons \@dbltoplist \@currbox
\@inserttrue
\fi
\fi
\fi
\else
\@getfpsbit 4\relax
\ifodd\@tempcnta
\@flsetnum \@dblbotnum
\ifnum \@dblbotnum>\z@
\@tempswafalse
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\else
\ifnum \@fpstype<\sixt@@n
\advance \@dbltoproom \@textmin
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\fi
\advance \@dbltoproom -\@textmin
\fi
\fi
\if@tempswa
\@tempdima -\ht\@currbox
\advance\@tempdima
-\ifx \@dblbotlist\@empty \dbltextfloatsep \else
\dblfloatsep \fi
\global \advance \@dbltoproom \@tempdima
\global \advance \@colht \@tempdima
\global \advance \@colroom \@tempdima
\global \advance \@dblbotnum \m@ne
\@cons \@dblbotlist \@currbox
\@inserttrue
\fi
\fi
\fi
\fi
\fi
\else
\@bitor\@currtype\@botlist
\if@test
\@addtobot
\else
\ifodd \count\@currbox
\advance \@reqcolroom \intextsep
\ifdim \@colroom>\@reqcolroom
\global \advance \@colnum \m@ne
\global \advance \@textfloatsheight \ht\@currbox
\global \advance \@textfloatsheight 2\intextsep
\@cons \@midlist \@currbox
\if@nobreak
\nobreak
\@nobreakfalse
\everypar{}
\else
\addpenalty \interlinepenalty
\fi
\vskip \intextsep
\box\@currbox
\penalty\interlinepenalty
\vskip\intextsep
\ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
\outputpenalty \z@
\@inserttrue
\fi
\fi
\if@insert
\else
\@addtotoporbot
\fi
\fi
\fi
\fi
\fi
\fi
\fi
\fi
\if@insert
\else
\@resethfps
\@cons\@deferlist\@currbox
\fi
}
\def\@addtotoporbot{
\@getfpsbit \tw@
\ifodd \@tempcnta
\@flsetnum \@topnum
\ifnum \@topnum>\z@
\@tempswafalse
\@flcheckspace \@toproom \@toplist
\if@tempswa
\@bitor\@currtype{\@midlist\@botlist\@dblbotlist}
\if@test
\else
\@flupdates \@topnum \@toproom \@toplist
\@inserttrue
\fi
\fi
\fi
\fi
\if@insert
\else
\@addtobot
\fi
}
\def\@addtobot{
\@getfpsbit 4\relax
\ifodd \@tempcnta
\@flsetnum \@botnum
\ifnum \@botnum>\z@
\@tempswafalse
\@flcheckspace \@botroom \@botlist
\if@tempswa
\@bitor\@currtype{\@dblbotlist}
\if@test
\else
\if@kernel@version@MMXXV\else \global \maxdepth \z@\fi
\@flupdates \@botnum \@botroom \@botlist
\@inserttrue
\fi
\fi
\fi
\fi
}
\def\@doclearpage{
\ifvoid\footins
\ifvbox\@kludgeins
{\setbox \@tempboxa \box \@kludgeins}
\fi
\setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
\setbox\@tempboxa\box\@cclv
\xdef\@deferlist{\@toplist\@botlist\@deferlist}
\global \let \@toplist \@empty
\global \let \@botlist \@empty
\global \@colroom \@colht
\ifx \@currlist\@empty
\else
\@latexerr{Float(s) lost}\@ehb
\global \let \@currlist \@empty
\fi
\@makefcolumn\@deferlist
\@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}
\if@twocolumn
\if@firstcolumn
\xdef\@deferlist{\@dbltoplist\@dblbotlist\@deferlist}
\global \let \@dblbotlist \@empty
\global \let \@dbltoplist \@empty
\global \@colht \textheight
\begingroup
\@dblfloatplacement
\@makefcolumn\@deferlist
\@whilesw\if@fcolmade \fi{\@outputpage
\@makefcolumn\@deferlist}
\endgroup
\else
\vbox{}\clearpage
\fi
\fi
\ifx\@deferlist\@empty \else\clearpage \fi
\else
\setbox\@cclv\vbox{\box\@cclv\vfil}
\@makecol\@opcol
\clearpage
\fi
}
\def\@combinedblfloats{
\ifx \@dbltoplist\@empty \else \@cdblflt \fi
\ifx \@dblbotlist\@empty \else \@cdblflb \fi
}
\def\@cdblflt{
\setbox\@tempboxa \vbox{}
\let \@elt \@comdblflelt
\@dbltoplist
\let \@elt \relax
\xdef \@freelist {\@freelist\@dbltoplist}
\global\let \@dbltoplist \@empty
\setbox\@outputbox \vbox
{
\unvbox\@tempboxa\vskip-\dblfloatsep
\ifnum \@dbltopnum>\m@ne
\dblfigrule
\fi
\vskip \dbltextfloatsep
\unvbox \@outputbox
}
}
\def\@cdblflb{
\setbox\@tempboxa \vbox{}
\let \@elt \@comdblflelt
\@dblbotlist
\let \@elt \relax
\xdef \@freelist {\@freelist\@dblbotlist}
\global\let \@dblbotlist \@empty
\setbox\@outputbox \vbox
{
\unvbox\@outputbox
\vskip \dbltextfloatsep
\ifnum \@dblbotnum>\m@ne
\dblfigrule
\fi
\unvbox\@tempboxa
\vskip -\dblfloatsep
}
}
\global\let\org@makecol@stfloats\@makecol
\gdef\fn@makecol{
\setbox\@outputbox \box\@cclv
\let\@elt\relax
\xdef\@freelist{\@freelist\@midlist}
\global \let \@midlist \@empty
\@combinefloats
\ifvoid\footins
\else
\setbox\@outputbox \vbox {
\boxmaxdepth \@maxdepth
\unvbox \@outputbox
\vskip \skip\footins
\color@begingroup
\normalcolor
\footnoterule
\unvbox \footins
\color@endgroup
}
\fi
\ifvbox\@kludgeins
\@makespecialcolbox
\else
\setbox\@outputbox \vbox to\@colht {
\@texttop
\dimen@ \dp\@outputbox
\unvbox \@outputbox
\vskip -\dimen@
\@textbottom
}
\fi
\global \maxdepth \@maxdepth
}
\def\fnbelowfloat{
\kernel@ifnextchar[{\fn@below@float}{\fn@below@float[floats-footnotes]}
}
\def\fn@below@float[#1]{
\if@kernel@version@MMXXV
\AssignSocketPlug{build/column/outputbox}{#1}
\else
\global\let\@makecol\fn@makecol
\fi
}
\def\fnunderfloat{
\kernel@ifnextchar[{\fn@under@float}{\fn@under@float[footnotes-floats-legacy]}
}
\def\fn@under@float[#1]{
\if@kernel@version@MMXXV
\AssignSocketPlug {build/column/outputbox}{#1}
\else
\global\let\@makecol\org@makecol@stfloats
\fi
}
\def\set@floatfontsize#1#2#3{
\@defaultunits\@tempdimb#2\p@\relax\@nnil
\edef\f@size{\strip@pt\@tempdimb}
\@defaultunits\@tempskipa#3\p@\relax\@nnil
\edef\f@baselineskip{\the\@tempskipa}
\edef\f@linespread{#1}
\let\baselinestretch\f@linespread
\def\size@update{
\baselineskip\f@baselineskip
\@tempskipa\baselineskip\relax\baselineskip=1\baselineskip
\advance\@tempskipa by-\baselineskip\baselineskip\f@baselineskip
\baselineskip\f@linespread\baselineskip
\advance\@tempskipa by\baselineskip\baselineskip\@tempskipa
\normalbaselineskip\baselineskip
\setbox\strutbox\hbox{
\vrule\@height.7\baselineskip
\@depth.3\baselineskip
\@width\z@}
\let\size@update\relax
}
}
\let\set@@@fontsize\set@fontsize
\def\setbaselinefloat{\let\set@fontsize\set@floatfontsize}
\def\setbaselinefixed{
\@tempdima=\baselinestretch\p@
\edef\baselinestretch{\strip@pt\@tempdima}
\let\set@fontsize\set@@@fontsize
}
\endinput