\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{PrimeTeX/packages/Layout}[2025-07-09]

% Suppress warning about \showhyphens being changed.
\let\CheckCommand\providecommand

\RequirePackage{ifthen}

\NewDocumentCommand{\providelength}{m O{0pt}}{%
	\ifdeflength{#1}{% It is already defined!
	}{% Not defined, so define it!
		\newlength{#1}%
	}%
	\setlength{#1}{#2}%
}

\RequirePackage{microtype}

% Page Layout
\RequirePackage[
	letterpaper,
	width			= 4.75in,	% 342pt,
	height			= 8.0in,	% 576pt,
	left			= 1.5in,	% 108pt,
	top 			= 1.5in,	% 108pt,
	head			= 12pt,		% 1/6in
	headsep			= 24pt,		% 1/3in
	marginparwidth	= 1.75in,	% 126pt,
	marginparsep	= 12pt,		% 1/6in
	footskip		= 0.5in,	% 36pt,
]{geometry}

\RequirePackage{float}

% Redefine the commands geometry uses to draw the page frame to customize the
% color.
\renewcommand{\Gm@vrule}{\color{layout}\vrule width 0.2pt height\textheight depth\z@}
\renewcommand{\Gm@hrule}{\color{layout}\hrule height 0.2pt depth\z@ width\textwidth}
\renewcommand{\Gm@hruled}{\color{layout}\hrule height\z@ depth0.2pt width\textwidth}

% Suppress "Underfull \hbox" infos.
\hbadness=10000

\ifthenelse{\boolean{isDraft}}{
	\geometry{showframe}
	\hfuzz = 0.5pt
	\vfuzz = 0.0pt
}{
	% Suppress small overfull infos.
	\hfuzz = 6.0pt
	\vfuzz = 8.0pt
}

\ifthenelse{\boolean{isElectronic}}{
%	\geometry{}
}{
	\geometry{twoside}
}

\RequirePackage{calc}
\RequirePackage[strict]{changepage}

\providelength{\marparwidth}[\marginparsep + \marginparwidth]
\providelength{\contentwidth}[\textwidth + \marparwidth]

\RequirePackage[
	debug,
	balanced,
	emergencystretch = 3em,
	max-cost		= 25000,
	widowpenalty	=  1000,
	orphanpenalty	=  1000,
	brokenpenalty	= 10000,
	nobreak = keep,
]{lua-widow-control}

\ifthenelse{\boolean{isDraft}}{
	\lwcsetup{showcolours=true,}
}{}

% Paragraph formatting.
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 3pt minus 3pt}

% Float Page Configuration
\renewcommand{\topfraction}{0.9}	% max fraction of floats at top
\renewcommand{\bottomfraction}{0.8}	% max fraction of floats at bottom
%   Parameters for TEXT pages (not float pages):
\setcounter{topnumber}{2}
\setcounter{bottomnumber}{2}
\setcounter{totalnumber}{4}     % 2 may work better
\setcounter{dbltopnumber}{2}    % for 2-column pages
\renewcommand{\dbltopfraction}{0.9}	% fit big float above 2-col. text
\renewcommand{\textfraction}{0.07}	% allow minimal text w. figs
%   Parameters for FLOAT pages (not text pages):
\renewcommand{\floatpagefraction}{0.8}	% require fuller float pages
% N.B.: floatpagefraction MUST be less than topfraction !!
\renewcommand{\dblfloatpagefraction}{0.8}	% require fuller float pages

% Line-breaking zero-width space
\NewDocumentCommand{\zws}{}{\hspace{0pt}}
% Line-breaking dot
\NewDocumentCommand{\bdot}{}{.\zws}

\NewDocumentEnvironment{SmartAdjustWidth}{O{\boolean{isElectronic}} m m +b}{%
	\ifthenelse{#1}{%
		\begin{adjustwidth}{#2}{#3}%
			#4%
		\end{adjustwidth}%
	}{%
		\begin{adjustwidth*}{#2}{#3}%
			#4%
		\end{adjustwidth*}%
	}%
}{}

\newcommand{\bigfloatoffsetratio}{2}

% Maximum width adjustment to fit 2 16x9 screensots on one page.
\providelength{\bigfloatoverhang}[0.54in]

\floatstyle{plain}
\newfloat{generic}{htpb}{lgf}

\NewDocumentEnvironment{BigFloat}{
	% #1: Float type
	O{generic}
	% #2: Overhang: the distance that the BigFloat extends into the margins.
	O{\bigfloatoverhang} 
	% #3: Float position: where the float may appear on the page.
	O{htpb} 
	% #4: Offset: the distance to offset the center of the BigFloat from the center
	%     of the text block.
	O{\bigfloatoffsetratio} 
	% #5: Body: what appears in the BigFloat.
	+b
}{%
	\begin{#1}[#3]% float environment
		\begin{SmartAdjustWidth}{-#2}{-#2 * \real{#4}}% adjustwidth(*)
			\begin{minipage}{\linewidth}%{#2 * (#4 + 1) + \textwidth}%
				\ifthenelse{\boolean{isDraft}}{%
					{\color{layout}\rule{\textwidth}{1pt}\zws}%
					#5%
					%{\color{layout}\rule{\textwidth}{1pt}}%
				}{%
					#5%
				}%
			\end{minipage}%
		\end{SmartAdjustWidth}%
	\end{#1}%
}{}