Files
PrimeTeX/packages/Floats.sty

312 lines
7.5 KiB
TeX

\NeedsTeXFormat{LaTeX2e}
%\ProvidesPackage{PrimeTeX/packages/Floats}[2025-09-03]
\ProvidesExplPackage{PrimeTeX/packages/Floats}{2025-09-03}{1.0}{
Custom Float Environments.
}
\RequirePackage{PrimeTeX/packages/Layout}
% I think this redefines how float environments evaluate the placement argument,
% allowing a command in the argument to be expanded before it is used. Otherwise
% it thinks we are trying to use the literal command name as the placement.
\def\ExpEnvOption#1#2[#3]{%
\expandafter\@expenvopt\expandafter{#3}{#1}{#2}
}
\def\@expenvopt#1#2#3{#2{#3}[#1]}
\RequirePackage{float}
\floatstyle{plain}
\newfloat{generic}{htpb}{lgf}
% Function for converting clists generated by multichoice keys into strings.
\NewDocumentCommand{\clist_use_default:Nnnn}{
% #1: Output string variable.
m
% #2: Input clist.
m
% #3: Default clist to use if #2 is empty.
m
% #4: Separator for \clist_use:Nn.
O{}
}{
\clist_if_empty:NT #2 {
\clist_set:Ne #2 {#3}
}
\str_set:Ne #1 {
\clist_use:Nn #2 {#4}
}
}
% Maximum width adjustment to fit 2 16x9 screensots on one page.
\dim_const:Nn \c_BigFloat_overhang_dim {0.54in}
\str_const:Nn \c_BigFloat_type_str {generic}
\clist_const:Nn \c_BigFloat_placement_clist {h,t,p,b}
\fp_const:Nn \c_BigFloat_offset_fp {2.0}
\ProvideLength{\BigFloatOverhang}[\dim_use:N \c_BigFloat_overhang_dim]
\NewDocumentCommand{\BigFloatOffset}{}{\fp_use:N \c_BigFloat_offset_fp}
\clist_new:N \l_BigFloat_placement_clist
\keys_define:nn{BigFloat}{
type .choices:nn = {figure,generic,table}{
\str_set:Ne \l_BigFloat_type_str {\l_keys_choice_tl}
},
type .default:e = {\c_BigFloat_type_str},
type .initial:e = {\c_BigFloat_type_str},
overhang .dim_set:N = \l_BigFloat_overhang_dim,
overhang .default:e = {\c_BigFloat_overhang_dim},
overhang .initial:e = {\c_BigFloat_overhang_dim},
placement .multichoices:nn = {b,H,h,p,t}{
\clist_put_right:Ne \l_BigFloat_placement_clist {\l_keys_choice_tl}
},
offset .fp_set:N = \l_BigFloat_offset_fp,
offset .default:e = {\c_BigFloat_offset_fp},
offset .initial:e = {\c_BigFloat_offset_fp},
}
\NewDocumentEnvironment{BigFloat}{
% #1: Key=value options.
O{}
% #2: Body: what appears in the BigFloat.
+b
}{%
\keys_set:nn{BigFloat}{#1}%
\clist_use_default:Nnnn \l_BigFloat_placement_str
{\l_BigFloat_placement_clist}
{\c_BigFloat_placement_clist}
\ExpEnvOption%
\begin{\l_BigFloat_type_str}[\l_BigFloat_placement_str]% float environment
\begin{SmartAdjustWidth}{%
\fp_to_dim:n {
-\l_BigFloat_overhang_dim
}%
}{%
\fp_to_dim:n {%
-\l_BigFloat_overhang_dim
* \l_BigFloat_offset_fp
}%
}%
\begin{minipage}{\linewidth}%
\ifthenelse{\boolean{isDraft}}{%
{\color{layout}\rule{\textwidth}{1pt}\zws}%
#2%
}{%
#2%
}%
\end{minipage}%
\end{SmartAdjustWidth}%
\end{\l_BigFloat_type_str}%
}{}
\clist_const:Nn \c_CenterFig_placement_clist {h, t, p, b}
\clist_new:N \l_CenterFig_placement_clist
\keys_define:nn{CenterFig}{
placement .multichoices:nn= {b,H,h,p,t}{
\clist_put_right:Nn \l_CenterFig_placement_clist {\l_keys_choice_tl}
},
}
\NewDocumentCommand{\CenterFig}{
% Key-value options passed to \includegraphics.
O{}
% Key-value options.
O{}
% Graphic file.
m
% Label.
>{\TrimSpaces}m
% Caption.
m
}{
\keys_set:nn{CenterFig}{#2}%
\clist_use_default:Nnnn \l_CenterFig_placement_str
{\l_CenterFig_placement_clist}
{\c_CenterFig_placement_clist}
\ExpEnvOption
\begin{figure}[\l_CenterFig_placement_str]%
\Centering%
\includegraphics[keepaspectratio,#1]{#3}%
\caption{#5}%
\label{fig:#4}%
\end{figure}%
}
\keys_define:nn{}{
BigFig .inherit:n = BigFloat,
}
\NewDocumentCommand{\BigFig}{
% Key=value options.
O{}
% Graphic file.
m
% Label.
>{\TrimSpaces}m
% Caption.
m
}{%
\keys_set:nn{BigFig}{#1}
\begin{BigFloat}[
type = figure,
overhang = \l_BigFloat_overhang_dim,
placement:e = {\clist_use:Nn \l_BigFloat_placement_clist {}},
offset = \l_BigFloat_offset_fp,
]%
\captionsetup{type=figure}%
\includegraphics[keepaspectratio,width=\linewidth]{#2}%
\Centering\captionof{figure}{#4}%\par
\label{fig:#3}%
\end{BigFloat}%
}
\keys_define:nn{DoubleBigFig}{
overhang .dim_set:N = \l_DoubleBigFig_overhang_dim,
overhang .initial:e = {\c_BigFloat_overhang_dim},
% overhang .default:e = {\c_BigFloat_overhang_dim},
offset .fp_set:N = \l_DoubleBigFig_offset_fp,
offset .initial:e = {\c_BigFloat_offset_fp},
% offset .default:e = {\c_BigFloat_offset_fp},
}
\NewDocumentCommand{\DoubleBigFig}{%
% Key=value options.
O{}
% First graphic filename.
m
% First graphic label.
>{\TrimSpaces}m
% First graphic caption.
m
% Second graphic filename.
m
% Second graphic label.
>{\TrimSpaces}m
% Second Graphic caption.
m
}{%
\keys_set:nn{DoubleBigFig}{#1}
\begin{BigFloat}[
type = figure,
overhang = \l_DoubleBigFig_overhang_dim,
placement = {p},
offset = \l_DoubleBigFig_offset_fp,
]%
\captionsetup{type=figure}%
\includegraphics[keepaspectratio,width=\textwidth]{#2}%
\Centering\captionof{figure}{#4}%
\label{fig:#3}
\bigskip
\captionsetup{type=figure}%
\includegraphics[keepaspectratio,width=\textwidth]{#5}%
\Centering\captionof{figure}{#7}%
\label{fig:#6}%
\end{BigFloat}%
}
\dim_const:Nn \c_TwinFig_space_dim {3pt}
\dim_const:Nn \c_TwinFig_width_dim {
\textwidth / 2 + \c_BigFloat_overhang_dim * 3 / 2 - \c_TwinFig_space_dim
}
\ProvideLength{\TwinFigWidth}[\dim_use:N \c_TwinFig_width_dim]
\keys_define:nn{TwinFig}{
overhang .dim_set:N = \l_TwinFig_overhang_dim,
overhang .initial:e = {\c_BigFloat_overhang_dim},
% overhang .default:e = {\c_BigFloat_overhang_dim},
placement .clist_set:N= \l_TwinFig_placement_clist,
placement .initial:e = {\c_BigFloat_placement_clist},
% placement .default:e = {\c_BigFloat_placement_clist},
offset .fp_set:N = \l_TwinFig_offset_fp,
offset .initial:e = {\c_BigFloat_offset_fp},
% offset .default:e = {\c_BigFloat_offset_fp},
valign .choices:nn = {b,f,h,m,t}{
\str_set:Ne \l_TwinFig_valign_str {\l_keys_choice_tl}
},
valign .initial:n = {m},
% valign .default:n = {m},
width .dim_set:N = \l_TwinFig_width_dim,
width .initial:e = {\c_TwinFig_width_dim},
% width .default:e = {\c_TwinFig_width_dim},
space .dim_set:N = \l_TwinFig_space_dim,
space .initial:e = {\c_TwinFig_space_dim},
% space .default:e = {\c_TwinFig_space_dim},
}
\NewDocumentCommand{\TwinFig}{%
% #1: Key=value options.
O{}
% #2: First graphic file.
m
% #3: First label.
>{\TrimSpaces}m
% #4: First caption.
>{\TrimSpaces}m
% #5: Second graphic file.
m
% #6: Second label.
>{\TrimSpaces}m
% #7: Second caption.
>{\TrimSpaces}m
}{%
\keys_set:nn{TwinFig}{#1}%
\begin{BigFloat}[
type = {figure},
overhang = \l_TwinFig_overhang_dim,
placement:e = \l_TwinFig_placement_clist,
offset = \l_TwinFig_offset_fp,
]%
%\typeout{TwinFig~valign:~"\l_TwinFig_valign_str"}
\begin{tblr}{%
colspec = {*{2}{Q[c,wd=\l_TwinFig_width_dim]}},%
rows:e = {\l_TwinFig_valign_str},
hlines = {0pt},
%vlines,% For debugging. Comment out when done.
hborder{1,Z} = {%
abovespace = 0pt,%
belowspace = 0pt,%
},%
vborder{1,Z} = {%
leftspace = 0pt,%
rightspace = 0pt,%
},%
vborder{2} = {%
leftspace = \l_TwinFig_space_dim,%
rightspace = \l_TwinFig_space_dim,%
},%
}%
\vfill
\captionsetup{type=figure}%
\includegraphics[%
keepaspectratio,width=\l_TwinFig_width_dim%
]{#2}%
\captionof{figure}{#4}%
\label{fig:#3}
\vfill%
&%
\vfill
\captionsetup{type=figure}%
\includegraphics[%
keepaspectratio,width=\l_TwinFig_width_dim%
]{#5}%
\captionof{figure}{#7}%
\label{fig:#6}
\vfill%
\\%
\end{tblr}%
\end{BigFloat}%
}