\NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{PrimeTeX/packages/Boxout}{2025-09-03}{1.0}{ Commands for typesetting boxouts. } \RequirePackage{PrimeTeX/packages/Layout} \RequirePackage{PrimeTeX/packages/Color} \RequirePackage{PrimeTeX/packages/Tables} \RequirePackage{calc} \ProvideLength{\boxoutpadding}[1em] \ProvideLength{\boxoutrule}[1pt] \NewTblrEnviron{tblrBoxout} \SetTblrInner[tblrBoxout]{ cells = {boxoutBG}, hborder{1} = {belowspace=\boxoutpadding}, hborder{Z} = {abovespace=\boxoutpadding}, hlines = {0pt,boxoutBG}, hline{1,Z} = {\boxoutrule,boxoutFG}, vborder{1} = {rightspace=\boxoutpadding}, vborder{Z} = {leftspace=\boxoutpadding}, vlines = {0pt,boxoutBG}, vline{1,Z} = {\boxoutrule,boxoutFG}, } \str_const:Nn \c_Boxout_colspec_str {{X[l,h]}} \bool_const:Nn \c_Boxout_warning_bool {\c_false_bool} \keys_define:nn{Boxout}{ colspec .str_set_e:N= \l_Boxout_colspec_str, colspec .initial:e = {\c_Boxout_colspec_str}, warning .bool_set:N = \l_Boxout_warning_bool, } \NewDocumentEnvironment{Boxout}{ % #1: Key-value options. O{} % #2: Label, passed to @boxout argument #1. >{\TrimSpaces}m % #3: Caption. m % #4: Body, passed to @boxout. +b }{% \keys_set:nn{Boxout}{#1} \bool_if:nT \l_Boxout_warning_bool {% \colorlet{boxoutBG}{warningBG}% \colorlet{boxoutFG}{warningFG}% }% \label{box:#2}% \message{colspec=\str_use:N \l_Boxout_colspec_str} \SetTblrInner{colspec:e=\l_Boxout_colspec_str} \begin{tblrBoxout}{}% \IfBlankF{#3}{\Centering\sbfamily\bfseries #3\\}% \setlength{\parskip}{\medskipamount}% #4\\% \end{tblrBoxout}% }{} \keys_define:nn{}{ BigBoxout .inherit:n = BigFloat, BigBoxout .inherit:n = Boxout, } \NewDocumentEnvironment{BigBoxout}{ % #1: Key-value options. O{} % #2: Label, passed to Boxout argument #1. >{\TrimSpaces}m % #5: Tabularray colspec, passed to Boxout argument #2. %O{X[l,h]} % #3: Caption, passed to Boxout argument #3. m % #4: Body, passed to Boxout. +b }{ \keys_set:nn{BigBoxout}{#1} \begin{BigFloat}[ type = generic, overhang = \l_BigFloat_overhang_dim, placement:e = \l_BigFloat_placement_clist, offset = \l_BigFloat_offset_fp, ]% \begin{Boxout}[% warning=\l_Boxout_warning_bool, colspec=\l_Boxout_colspec_str, ]{#2}[\l_Boxout_colspec_str]{#3}% #4% \end{Boxout}% \end{BigFloat}% }{} \str_const:Nn \c_WrapBoxout_position_str {o} \dim_const:Nn \c_WrapBoxout_offset_dim {\marparwidth} \dim_const:Nn \c_WrapBoxout_width_dim {3in} \keys_define:nn{}{ WrapBoxout .inherit:n = Boxout, } \keys_define:nn{WrapBoxout}{ position .choices:nn = {l,r,i,o}{ \str_set:Nn \l_WrapBoxout_position_str {\l_keys_choice_tl} }, position .initial:e = {\c_WrapBoxout_position_str}, offset .dim_set:N = \l_WrapBoxout_offset_dim, offset .initial:e = {\c_WrapBoxout_offset_dim}, width .dim_set:N = \l_WrapBoxout_width_dim, width .initial:e = {\c_WrapBoxout_width_dim}, } \NewDocumentEnvironment{WrapBoxout}{ % #1: Key-value options. O{} % #2: Label. >{\TrimSpaces}m % #3: Caption m % #4: Body. +b }{% \keys_set:nn{WrapBoxout}{#1} \begin{wrapfigure}{\l_WrapBoxout_position_str}[\l_WrapBoxout_offset_dim]% \begin{minipage}{\l_WrapBoxout_width_dim}% \begin{Boxout}[ colspec = \l_Boxout_colspec_str, warning = \l_Boxout_warning_bool, ]{#2}{#3}% #4% \end{Boxout}% \end{minipage}% \end{wrapfigure}% }{}