Files
PrimeTeX/packages/Boxout.sty
2025-09-09 23:48:36 -05:00

152 lines
3.7 KiB
TeX

\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},
}
% \SetTblrOuter[tblrBoxout]{
% expand+ = \l_Boxout_body_tl,
% }
\tl_const:Nn \c_Boxout_innerspec_tl {colspec={X[l,h]}}
\bool_const:Nn \c_Boxout_warning_bool {\c_false_bool}
\tl_new:N \l_Boxout_title_tl
\keys_define:nn{Boxout}{
innerspec .tl_set_e:N= \l_Boxout_innerspec_tl,
innerspec .initial:e = {\c_Boxout_innerspec_tl},
innerspec .default:e = {\c_Boxout_innerspec_tl},
warning .bool_set:N = \l_Boxout_warning_bool,
warning .initial:e = {false},
warning .default:e = {true},
}
% \NewExpandableDocumentCommand{\__Boxout_body:Nnn}{m +m +m}{
% %\message{boxout~body~start}
% }
\NewDocumentEnvironment{Boxout}{
% #1: Key-value options.
O{}
% #2: Label, passed to @boxout argument #1.
>{\TrimSpaces}m
% #3: Caption.
O{}
% #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}
\tl_if_empty:nTF {#3} {
\expanded{\noexpand\begin{tblrBoxout}{\l_Boxout_innerspec_tl}}
\setlength{\parskip}{\medskipamount}
#4\\
\end{tblrBoxout}
}{
\expanded{\noexpand\begin{tblrBoxout}{\l_Boxout_innerspec_tl}}
\SetCell{halign=c, font={\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
% #3: Caption, passed to Boxout argument #3.
O{}
% #4: Body, passed to Boxout.
+b
}{
\keys_set:nn{BigBoxout}{#1}
\begin{BigFloat}[
type = generic,
overhang = \l_BigFloat_overhang_dim,
placement:e = \l_Float_placement_clist,
offset = \l_BigFloat_offset_fp,
]%
\begin{Boxout}[%
innerspec:e = \l_Boxout_innerspec_tl,
warning:e = \bool_to_str:N \l_Boxout_warning_bool,
]{#2}[#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,l,R,r,I,i,O,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
O{}
% #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}[
innerspec:e = \l_Boxout_innerspec_tl,
warning:e = \bool_to_str:N \l_Boxout_warning_bool,
]{#2}[#3]%
#4%
\end{Boxout}%
\end{minipage}%
\end{wrapfigure}%
}{}