%
% \iffalse meta-comment
%
% Copyright 2016 Brian Dunn
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% \fi

%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{keyfloat}
%<package>    [2021/06/11 v2.05 Key/value interface for floats and subfloats.]
%
%<*driver>
\documentclass{ltxdoc}

\newcommand*{\mypackagename}{keyfloat}
\newcommand{\quicksummary}{Provides a key/value interface for generating floats.}


% \usepackage{lmodern}
\usepackage{erewhon}
\usepackage{roboto}
% \usepackage{sourcesanspro}
\usepackage{inconsolata}
% \usepackage{libertine}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}	% provides \degree, \textquotesingle, \textmu


\newcommand*{\TakeFourierOrnament}[1]{{%
\fontencoding{U}\fontfamily{futs}\selectfont\char#1}}

\newcommand*{\textwarning}{\TakeFourierOrnament{66}}

% copy/paste special unicode symbols:
\input{glyphtounicode}
\pdfglyphtounicode{prime}{2032}% hex
\pdfglyphtounicode{diameter}{2300}% diameter
\pdfglyphtounicode{warningsign}{26A0}% warning sign
\pdfgentounicode=1

\usepackage{newunicodechar}
\newunicodechar{ﬀ}{ff}
\newunicodechar{ﬁ}{fi}
\newunicodechar{ﬂ}{fl}
\newunicodechar{ﬃ}{ffi}
\newunicodechar{ﬄ}{ffl}
% \newunicodechar{°}{\degree}
\newunicodechar{ρ}{\ensuremath{\rho}}
\newunicodechar{⨯}{\texttimes}
\newunicodechar{⁄}{\textfractionsolidus}
% \newunicodechar{®}{\textregistered}
% \newunicodechar{©}{\textcopyright}
\newunicodechar{—}{---}
\newunicodechar{–}{--}
% \newunicodechar{”}{''}
% \newunicodechar{“}{``}
% \newunicodechar{§}{\S}
% \newunicodechar{¶}{\P}
% \newunicodechar{†}{\dag}
\newunicodechar{‡}{\ddag}
\newunicodechar{⚠}{\textwarning}

\usepackage{metalogo}
\makeatletter
\@ifpackageloaded{erewhon}{
\setlogokern{Te}{-.08em}
\setlogokern{eX}{-0.04em}
\setlogokern{La}{-.25em}
\setlogokern{aT}{-.08em}
\setlogokern{Xe}{-.04em}
\setlogokern{eL}{-.06em}
\setlogodrop{0.27ex}
}{}
\makeatother

\usepackage{microtype}

\usepackage{etoolbox}

\usepackage[log-declarations=false]{xparse}

\usepackage[svgnames]{xcolor}
\definecolor{myurlcolor}{rgb}{0,0,.7}
\definecolor{mylinkcolor}{rgb}{.7,0,0}
\definecolor{codecolor}{rgb}{0,.4,.2}
\definecolor{overviewcolor}{rgb}{0,.2,.4}


\usepackage{graphicx}
\graphicspath{{images/}}

\usepackage{enumitem}

\usepackage{needspace}

\usepackage{array}
\usepackage{booktabs}
\usepackage{threeparttable}

\usepackage{fancybox}% must be loaded before fancyvrb
\usepackage{fancyvrb}


\usepackage{caption}
\usepackage{newfloat}

\DeclareFloatingEnvironment[
fileext=lox,
listname={List of Examples},
name=Example,
placement=hbp
]{example}

\captionsetup*[example]{
format=hang,
font=bf,
justification=raggedright,
singlelinecheck=false,
skip=0pt,
position=top,
}

\captionsetup{labelfont={small,bf},textfont={small,bf}}

\captionsetup*[figure]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=2ex,
	labelfont={small,bf},textfont={small,bf}
}

\captionsetup*[table]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=1ex,
	labelfont={small,bf},textfont={small,bf},
    position=top
}

\captionsetup*[subfigure]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=2ex,
	labelfont={small},textfont={small}
}

\captionsetup*[subtable]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=1ex,
	labelfont={small},textfont={small},
    position=top
}

\captionsetup*[example]{
	format=plain, justification=justified,
	margin=0pt, parskip=0pt, skip=0ex,
	labelfont={bf},textfont={bf}
}

\captionsetup*[wrapfigure]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=2ex,
	labelfont={small,bf},textfont={small,bf}
}

\captionsetup*[wraptable]{
	style=default, justification=centering,
	margin=0pt, parskip=0pt, skip=1ex,
	labelfont={small,bf},textfont={small,bf}
}



\usepackage{blindtext}



\usepackage{tikz}
\usetikzlibrary{positioning,fit,backgrounds,calc,shapes.geometric,shadows}

\usepackage[framemethod=tikz]{mdframed}

\mdfdefinestyle{boxroundshadow}{linewidth=1pt,innerleftmargin=0in,innerrightmargin=0in,%
innertopmargin=0in,innerbottommargin=0in,%
align=center,roundcorner=3pt,shadow=true,shadowcolor=black!50,shadowsize=4pt,%
leftmargin=0pt,rightmargin=0pt,%
frametitlebackgroundcolor=black!15,%
skipabove=0ex,skipbelow=0ex,%
frametitlerulewidth=1pt,frametitleaboveskip=5pt,%
}

\newmdenv[style=boxroundshadow,align=center]{mdtightframe}

\newmdenv[style=boxroundshadow,align=center,%
	innertopmargin=3pt,innerbottommargin=3pt,%
	innerleftmargin=3pt,innerrightmargin=3pt]{mdlooseframe}


\usepackage[normalem]{ulem}


\usepackage{tocdata}[2019/03/21]% v2.02 or later

\usepackage{tocloft}
\setlength{\cftsubsecnumwidth}{3em}
\setlength{\cftsubsubsecindent}{2.8em}
\setlength{\cftsubsubsecnumwidth}{4em}
\setlength{\cftbeforesubsecskip}{1ex}

% \usepackage{titletoc}



\usepackage{titleps}

\newpagestyle{pageheadfoot}{
	\headrule
	\sethead{\pkg{\mypackagename}}{}{\thepage}
% 	\renewcommand{\makefootrule}{\rule[2.5ex]{\linewidth}{.4pt}}
	\setfoot{}{}{}
}

\pagestyle{pageheadfoot}


\usepackage{dtxdescribe}[2019/01/11]



\newcommand{\testtable}{%
\begin{tabular}{cc}%
\hline\rule{0pt}{2.7ex}%
A & B \\
C & D \\
\hline
\end{tabular}%
}

\newcommand{\testwidetable}{%
\begin{tabular}{cccc}%
\hline\rule{0pt}{2.7ex}%
A & B & C \\
D & E & F \\
\hline
\end{tabular}%
}


\newcommand{\mainsubarg}{empty or ``\texttt{subgrp}''}
\newcommand{\keyvalsarg}{keys/values}

\setlength{\floatsep}{5ex plus 1ex minus 1ex}
\setlength{\dblfloatsep}{5ex plus 1ex minus 1ex}


\usepackage{\mypackagename}


\usepackage[pdftex,bookmarks=true,hidelinks,%
colorlinks,linkcolor=mylinkcolor,urlcolor=myurlcolor,%
pageanchor=true,hyperindex=true,
]{hyperref}

\hypersetup{%
pdfinfo={%
Title={The LaTeX \mypackagename\ package},%
Author={Brian Dunn},%
Subject={A key/value interface for LaTeX floats.},%
Keywords={LaTeX, floats, key/val, subcaption, rows}%
}}

\pdfstringdefDisableCommands{
\def\quad{ }
\def\\{ }
\def\pkg#1{#1}
\def\cs#1{\textbackslash#1}
\def\env#1{#1}
\def\,{ }
\def\prog#1{#1}
\def\LuaLaTeX{LuaLaTeX}
\def\XeLaTeX{XeLaTeX}
\def\TeX{TeX}
\def\LaTeX{LaTeX}
\def\Dash{ --- }
\def\dash{ -- }
\def\element#1{#1}
\def\attribute#1{#1}
}


\usepackage{cleveref}



\setcounter{IndexColumns}{2}

\DisableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{\mypackagename.dtx}
\end{document}
%
%</driver>
% 
% \fi
%
% \iffalse
%<*package>
% \fi
%
% \CheckSum{1320}
%
% \CharacterTable
% {Upper-case     \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote \"      Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent \'      Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than \>      Question mark \?
%   Commercial at \@     Left bracket \[      Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent \`      Left brace    \{     Vertical bar \|
%   Right brace   \}     Tilde         \~}

% \changes{v0.10}{2016/12/01}{\ 2016/12/01 Initial ver.}
% \changes{v0.11}{2016/12/02}{\ 2016/12/02}
% \changes{v0.12}{2016/12/09}{\ 2016/12/09}
% \changes{v0.12}{2016/12/02}{Docs: Loading keyfloat.}
% \changes{v0.12}{2016/12/05}{Docs: Improved index.}
% \changes{v0.13}{2017/01/18}{\ 2017/01/18}
% \changes{v0.13}{2017/01/12}{Docs: Other Settings.}
% \changes{v0.14}{2017/02/09}{\ 2017/02/09}
% \changes{v0.15}{2017/05/12}{\ 2017/05/12}
% \changes{v1.00}{2019/01/11}{\ 2019/01/11}
% \changes{v1.00}{2019/01/08}{Source formatting improvements.}
% \changes{v1.00}{2019/01/08}{Docs \PDF\ bookmark improvements.}
% \changes{v1.00}{2019/01/08}{Removed spurious spaces.}
% \changes{v2.00}{2019/03/21}{\ 2019/03/21}
% \changes{v2.00}{2019/03/17}{Added custom float types.}
% \changes{v2.00}{2019/03/17}{Added float authors.}
% \changes{v2.01}{2019/09/23}{2019/09/23}
% \changes{v2.02}{2021/05/28}{2021/05/27}
% \changes{v2.03}{2021/05/28}{Fixed \cs{hbadness} w/ \cs{relax}.}
% \changes{v2.03}{2021/05/28}{2021/05/28}
% \changes{v2.04}{2021/06/08}{2021/06/08}
% \changes{v2.05}{2021/06/11}{2021/06/11}



% \GetFileInfo{\mypackagename.sty}
%
% \DoNotIndex{\newcommand,\renewcommand,\addtocounter,\begin,\end,\begingroup,\endgroup}
% \DoNotIndex{\global,\ifbool,\ifthenelse,\isequivalentto,\let}
% \DoNotIndex{\booltrue,\boolfalse}
% \expandafter\DoNotIndex\expandafter{\detokenize{\(,\),\,,\\,\#,\$,\%,\^,\_,\~,\ ,\&,\{,\}}}
%
%
% \thispagestyle{empty}
% \begin{center}
% \vfill
% ^^A \includegraphics[width=.3\linewidth]{\mypackagename_logo.pdf}
% \vfill
% {\Huge The \LaTeX\ \pkg{\mypackagename} Package}
% \bigskip
%
% \fileversion{} --- \filedate
%
% \bigskip
%
% {\small\textcopyright{} 2016--2021} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}
%
% \vspace{.5in}
%
% {\Large \textup{\quicksummary}}
%
%
% \vfill
%
% 
% ^^A % \title{The \pkg{keyfloat} package\thanks{This document
% ^^A %   corresponds to \pkg{keyfloat}~\fileversion,
% ^^A %   dated \filedate.}}
% ^^A % \author{{\small\textcopyright{} 2016} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}}
% ^^A % \published{}
% ^^A % \subtitle{\textup{Subtitle}}
% ^^A %
% ^^A % \maketitle
%
% \vfill
%
%
% \begin{abstract}
% \noindent
% The \pkg{keyfloat} package provides a key/value user interface for quickly
% creating figures with a single image each, figures with arbitrary contents,
% tables, subfloats, rows of floats, floats located [H]ere,
% floats in the [M]argin, and floats with text [W]rapped around them.
%
% Key/value combinations may specify a caption and label, a width proportional
% to \cs{linewidth}, a fixed width and/or height, rotation, scaling, a
% tight or loose frame, an \cs{arraystretch}, a continued float,
% additional supplemental text,
% and an artist/author's name with automatic index entry.
% When used with the \pkg{tocdata} package, the name also appears in the
% List of Figures.
%
% Floats may be moved into or rearranged inside a multi-row environment or subfloats,
% and are typeset to fit within the given number of columns,
% continuing to additional rows as necessary.
% Nested sub-rows may be used to generate layouts such as
% two small figures placed vertically next to
% one larger figure.
%
% \vfill
%
% \noindent
% As an example, a typical command to include a figure with a framed image of half \cs{linewidth}
% could be: \\
% \hspace*{1em}\verb|\keyfig*[hbp]{f,lw=.5,c={A caption},l={fig:label}}{image}|
%
% \vfill
%
% \noindent \pkg{keyfloat} uses the \pkg{caption}, \pkg{subcaption},
% \pkg{newfloat} or \pkg{float}, and \pkg{wrapfig} packages,
% \watchout
% and cannot be used with the
% \pkg{subfig}, \pkg{subfigure}, \pkg{subfloat}, \pkg{floatrow},
% or \pkg{floatflt} packages.
%
% \vfill
%
% \footnotesize
% \begin{description}
% \item[License:] \
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
% \end{description}
%
% \end{abstract}
%
% \vspace*{\fill}
% \vspace*{\fill}
% \vspace*{\fill}
% \end{center}
% \clearpage
%
% \tableofcontents
% \listofexamples
% \listoffigures
% \listoftables
%
%
% \thispagestyle{pageheadfoot}
%
% \clearpage
%
%^^A \part{keyfloat.sty}
%
% \section{Introduction}
%
% The \pkg{keyfloat} package simplifies the creation
% of \LaTeX\ floats, while still allowing a large number of useful features.
%
%
% \subsection{A problem with floats}
%
% When including a figure with a graphics image into a document,
% the user typically enters something such as:
% \begin{sourceverb}
% \begin{figure}
% \centering
% \includegraphics[width=3in]{filename}
% \caption{A Figure}
% \label{fig:somelabel}
% \end{figure}
% \end{sourceverb}
% \unskip
%
% When doing that often enough, it makes sense to factor the common code:
% \begin{sourceverb}
% \onefigure[3in]{filename}{A Figure}{fig:somelabel}
% \end{sourceverb}
% \unskip
% 
% Expanding the capability of \cs{onefigure} via \pkg{xparse} can lead to the general case of:
% \begin{sourceverb}
% \onefigure*[loc](width){filename}(add'l text)[shortcap]{caption}*[label]
% \end{sourceverb}
% \unskip
% Attempting to add additional features such as frames and continued floats
% hits the limit of nine parameters for a \TeX\ macro,
% requiring that new features use some kind of change-state macros instead.
% Attempting to support rows of floats or subfloats only makes things more complicated still.
% 
% A key/value system solves the problem of adding more features,
% does not require much additional typing, is a more self-documenting
% syntax, and allows a shared syntax with subfloats and groups of floats as well.
% Thus, the \pkg{keyfloat} package.
%
% \subsection{The \pkg{keyfloat} package}
% 
% Using \pkg{keyfloat}, the previous example becomes:
% \begin{sourceverb}
% \keyfig{w=3in,c=A figure,l=fig:somelabel}{filename}
% \end{sourceverb}
% \unskip
% 
% The \cs{onefigure} general case becomes:
% \begin{sourceverb}
% \keyfig*[loc]{w=width,t={add'l text},sc=shortcap,cstar=caption,
%     l=label}{filename}
% \end{sourceverb}
%
%
% \subsection{Features}
%
% The macros and environments provided by \pkg{keyfloat} include:
% \begin{description}
% \item[\cs{keyfig}:] A figure with an image.
% \item[\cs{keytab}:] A table.
% \item[\cs{keyflt}:] An arbitrary float type macro.
% \item[\cs{keyfigbox}:] A figure with arbitrary contents.
% \item[\cs{keyparbox}:] A ``figure'' without a caption, useful
%	to place uncaptioned text inside a group,
% \item[\env{keyfigure}:] A figure environment.
% \item[\env{keytable}:] A table environment.
% \item[\env{keyfloat}:] An arbitrary float type environment.
% \item[\env{keyfloats}:] A group of rows and columns of floats.
% \item[\env{keysubfigs}:] A figure containing a group of rows and columns of subfigures.
% \item[\env{keysubtabs}:] A table containing a group of rows and columns of subtables.
% \item[\env{keysubfloats}:] A float of arbitrary type containing a group of rows and columns of subfloats.
% \item[\env{keywrap}:] Wraps a keyfloat around an environment of text.  Usable inside a list.
% \item[\env{marginfigure}:] A figure environment placed into
%	the margin.\footnote{\env{marginfigure} and \env{margintable}: The environments
%	provided by the |tufte-book| class are used if loaded,
%	otherwise \pkg{keyfloat} provides its own versions.}
% \item[\env{margintable}:] A table environment placed in the margin.
% \end{description}
%
% Additional features include:
% \begin{itemize}
% \item Rows and columns of floats may be generated by placing them inside a \env{keyfloats}
% environment.
% \item Subfloats may be generated by placing them inside a \env{keysubfigs}
% or \env{keysubtabs} environment.
% \item Dynamic layout: The number of columns is specified. Extra
% 	floats are placed onto additional rows as needed, with the final row
% 	adjusted to compensate for leftovers.
% \item Floats may be placed \optn{[H]}ere.
% \item Floats may be placed in the \optn{[M]}argin.
% \item Floats may be placed with text \optn{[W]}rapped around them.
% \item Floats may be starred to span two columns.
% \item Continued floats may be used to repeat the previous float number.
% \item A figure may contain an image, with additional sizing, rotation, and a frame.
% \item Tables may be stretched. (\cs{arraystretch})
% \item Boxes of arbitrary contents may be assigned a width and framed.
% \item Floats may be moved into and out of the grouping environments as needed.
% \item An artist/author's name may be added to a figure and the index.
% \item If the \pkg{tocdata} package is loaded (use v0.12+),
%	the name is also added to the \acro{LOF}.
% \item Additional descriptive text may be added as well.
% \item Frames may be customized.
% \end{itemize}
%
% A large number of examples are provided, each showing \LaTeX\ source and
% \margintag{examples}
% the resulting float.
%
% A customized index is included at the back of the documentation.
% \margintag{index}
%
% Blue margin tags are used to help quickly find information, and often
% \margintag{margin tags}
% indicate the destination of index entries.
%
% Several warnings are noted in the text.  Watch out for these special cases.
% \watchout[warnings]
%
% See the ``troubleshooting'' section of the index for help
% \margintag{problems}
% with specific problems which may occur.
%
%
%
% \clearpage
%
% \section{Using the \pkg{keyfloat} package}
%
% \subsection{Loading \pkg{keyfloat} and related packages}
%
% \pkg{keyfloat} is loaded with the usual command:
% \begin{sourcedisplay}
% 	\cs{usepackage}\{keyfloat\}
% \end{sourcedisplay}
%
%
% If you wish to have artists' names appear in the list of figures,
% \DescribePackage{tocdata}
% \DescribePackage{tocloft}
% \DescribePackage{titletoc}
% as provided by the \pkg{tocdata} package,
% load \pkg{tocdata},
% optionally followed by either \pkg{tocloft} or \pkg{titletoc},
% then \pkg{keyfloat}:
% \begin{sourcedisplay}
% 	\cs{usepackage}\{tocdata\} \\
%   \cs{usepackage}\{titletoc\}\% or titletoc, or neither \\
% 	\cs{usepackage}\{keyfloat\}
% \end{sourcedisplay}
%
% To use custom float types with the \pkg{float} package:
% \DescribePackage{float}
% \begin{sourceverb}
% \usepackage{float}
% \newfloat{diagram}{htb}{lod}
% \end{sourceverb}
%
% To use custom float types with the \pkg{newfloat} package:
% \DescribePackage{newfloat}
% \begin{sourceverb}
% \usepackage{newfloat}
% \DeclareFloatingEnvironment[
%     fileext={lod},
%     listname={List of Diagrams},
%     name={Diagram},
% ]{diagram}
% \end{sourceverb}
%
% For the \pkg{caption} package, to have table captions appear above the tables, and
% \DescribePackage{caption}
% to use custom float types:
% \begin{sourceverb}
% \usepackage[tableposition=top]{caption}
% \captionsetup[diagram]{
%     style=default, justification=centering,
%     margin=0pt, parskip=0pt, skip=1ex,
%     labelfont={small,bf},textfont={small,bf}
% }
% \end{sourceverb}
%
% To use custom float and subfloat types with \pkg{cleveref}:
% \DescribePackage{cleveref}
% \begin{sourceverb}
% \usepackage{cleveref}
% \crefname{diagram}{diagram}{diagrams}
% \crefname{subdiagram}{subdiagram}{subdiagrams}
% \end{sourceverb}
%
%
% \needspace{7\baselineskip}
% \subsection{Macros and environments}
%
% \DescribeMacro{\keyfig} * \oarg{loc} \marg{\keyvalsarg} \marg{image filename} \\
% A macro to generate a figure with an image from a file.
%
% \DescribeMacro{\keytab} * \oarg{loc} \marg{\keyvalsarg} \marg{tabular contents} \\
% A macro to generate a table with tabular contents.
% Usually use the \env{keytable} environment instead.
%
% \DescribeMacro{\keyflt} * \oarg{loc} \marg{float type} \marg{keys/values} \marg{contents} \\
% A macro to generate an arbitrary float type with its contents.
%
% \DescribeMacro{\keyfigbox} * \oarg{loc} \marg{\keyvalsarg} \marg{box contents} \\
% A macro to generate a figure with arbitrary paragraph contents.
% See \cref{ex:keyfigbox}.
%
% \DescribeMacro{\keyparbox} * \oarg{loc} \marg{\keyvalsarg} \marg{box contents} \\
% A macro to generate a figure with arbitrary paragraph contents,
% but no number or caption. This is equal to a \cs{keyfigbox} with |cstar={}|.
% Mostly useful to add supplemental information inside a row of floats or subfloats.
% See \cref{ex:keyparbox}.
%
% \DescribeEnv{keyfigure} * \oarg{loc} \marg{\keyvalsarg} \\
% An environment to generate a figure with arbitrary contents.
% Useful for multi-paragraph contents.
% See \cref{ex:keyfigure}.
%
% \DescribeEnv{keytable} * \oarg{loc} \marg{\keyvalsarg} \\
% An environment to generate a table with arbitrary contents.
% Useful for larger tables.
% See \cref{ex:keytable}.
%
% \DescribeEnv{keyfloat} * \oarg{loc} \marg{float type} \marg{\keyvalsarg} \\
% An environment to generate an arbitrary float type with its contents.
% Useful for multi-paragraph contents.
%
% \begin{docsidebar}
% \textbf{The above macros and environments may be used by themselves,
% or inside the following \env{keyfloats}, \env{keysubfigs}, or
% \env{keysubtabs} environments.}
% \end{docsidebar}
%
%
% \DescribeEnv{keyfloats} * \oarg{loc} \marg{num columns} \\
% A group of figures or tables typeset in rows.  May be nested, [H], [W], or [M].
% See \cref{ex:keyfloats}.
%
% \DescribeEnv{keysubfigs} * \oarg{loc} \marg{numcols} \marg{keys} \\
% A group of subfigures typeset in rows.
% May \emph{not} be nested.  May be [H], [W], or [M].
% See \cref{ex:keysubfigs}.
%
% \needspace{2\baselineskip}
% \DescribeEnv{keysubtabs} * \oarg{loc} \marg{numcols} \marg{keys} \\
% A group of subtables typeset in rows.
% May \emph{not} be nested.  May be [H], [W], or [M].
% See \cref{ex:keysubtabs}.
%
% \needspace{2\baselineskip}
% \DescribeEnv{keysubfloats} * \oarg{loc} \marg{float type} \marg{numcols} \marg{keys} \\
% A group of subfloats typeset in rows.
% May \emph{not} be nested.  May be [H], [W], or [M].
%
% \DescribeEnv{keywrap} \marg{width of keyfloat} \marg{keyfloat} \\
% Displays a keyfloat next to an environment of text.
% Two minipages are used side-by-side, which allows its use inside a list item
% where [W] will not work, but extra empty vertical space
% \watchout[empty space]
% will appear if the keyfloat and the text are of unequal vertical size.
% \meta{keyfloat} may be any of \cs{keyfig}, \env{keyfigure},
% \env{keyfloats}, \env{keysubfigs}, etc., each with its proper arguments.
% See \cref{ex:keywrapkeyfig}.
%
% \DescribeEnv{marginfigure} \oarg{offset} \\
% A figure placed into the margin, with an optional vertical offset.
% \cs{keyfloat} uses the version provided by the |tufte-book| class if available,
% or provides its own version otherwise.
% See \cref{ex:marginfigure}.
%
% \DescribeEnv{margintable} \oarg{offset} \\
% A table placed into the margin, with an optional vertical offset.
% \cs{keyfloat} uses the version provided by the |tufte-book| class if available,
% or provides its own version otherwise.
% See \cref{ex:margintable}.
%
% \medskip\hrule\medskip
%
% \DescribeArgument{*}
% The star option create floats which span both columns in a two-column
% document.
%
% \DescribeArgument{{[H]}}
% The |[H]| location forces a figure to be ``Here'', in the
% form of a minipage instead of a float.  A caption, label, etc.\ may
% still be assigned.
%
% \DescribeArgument{{[M]}}
% The |[M]| location places the float into the margin.  When the |tufte-book| class
% is used, its \env{marginfigure} and \env{margintable} environments are used,
% otherwise \pkg{keyfloat} provides and uses its own versions of the same environments.
% See \cref{ex:keyfigm,ex:keytablem}.
%
% \DescribeArgument{{[W]}}\DescribePackage{wrapfig}
% The |[W]| location wraps text around the float.  Use this just before the start of
% a paragraph with contents large enough to wrap around the float.  Do not use this
% inside a list environment.  Select placement with the |wp| key; see
% the \pkg{wrapfig} package documentation for more information.
% Use \optn{w} or \optn{lw} to set the width of the item \Slash image contained
% inside the wrap area.  By default the caption will also be contained in this width.
% To use a larger width for the overall container and caption,
% set \optn{w} or \optn{lw} for the size of the image, and also use
% \optn{ww} or \optn{wlw} for a larger size for the caption.
% Watch the log for warnings from \pkg{wrapfig}.\watchout[\pkg{wrapfig} warnings]
%
% \DescribeArgument{{[loc]}}
% The star and [loc] options are ignored for floats inside a \env{keyfloats},
% \env{keysubfigs}, or \env{keysubtabs} environment.  Note that these
% container environments may have their own star and [loc] options.
%
%
% \clearpage
%
%
%
%
% \subsection{Keys and values}
%
% \changes{v2.05}{2021/06/11}{Docs: Fixed braces for multi-word values.}
%
% \newcommand{\largebullet}{{\Large\textbullet}}
%
% \begin{keytable}[bp]{c={Keys and values — part I},l={tab:keyvals},stretch=1.5}
% \centering
% \index{keys>and values}
% \begin{threeparttable}
% \small
% \begin{tabular}{>{\ttfamily}cc>{\raggedright}p{2.5in}>{\centering\arraybackslash}>{\ttfamily\arraybackslash}p{1in}}
% \toprule
% \textrm{Key} & Sub\tnote{a} & Description & \textrm{Example} \\
% \midrule
% c & \largebullet &  An unstarred caption.
%	If empty, creates a figure with a number but no caption. & c=\{A caption\} \\
% cstar & \largebullet &  A starred caption.  Creates a float without a number.
% 	If empty, creates a figure with no number or caption. & cstar=\{No Num\} \\
% sc & \largebullet &  The short caption for the \acro{LOF}/\acro{LOT}, even if cstar. & sc=\{Short cap\} \\
% cont & \largebullet &  Continued float?  & cont \\
% l & \largebullet &  The label.  Enclose in braces if a comma is included.
%	Ignored in unnumbered floats. & l=fig:alabel  \\
% ap, aup & \largebullet & Artist/author's prefix, such as ``Mr.''\,\tnote{b} & ap=Mr. \\
% af, auf & \largebullet & Artist/author's first name.\tnote{b} & af=First \\
% al, aul & \largebullet & Artist/author's last name.\tnote{b} & al=Last \\
% as, aus & \largebullet & Artist/author's suffix, such as |~III|.\tnote{b} & |al=~III| \\
% t & \largebullet &  Additional text.  May include paragraphs. \\
% 	Enclose in braces if a comma is included. 
%	May need \cs{protect} before macro calls.
%	Fully-justified alignment.
%	& t=\{Paragraphs\} \\
% tc & \largebullet & Additional text, aligned to the center. & tc=\{Paragraphs\} \\
% tl & \largebullet & Additional text, aligned to the left. & tl=\{Paragraphs\} \\
% tr & \largebullet & Additional text, aligned to the right. & tr=\{Paragraphs\} \\
% \bottomrule
% \end{tabular}
% \begin{tablenotes}
% \item[a:] All the keys in Part I may be used with the
%	\env{keysubfigs}, \env{keysubtabs}, and \env{keysubfloats} environments.
% \item[b:] Artist \Slash author keys:
%   |al| is an artist's last name, |aul| is an author's last name, etc.
%   Artists names are printed centered, authors are flush right.
%	A fixed-width non-breakable space is placed between parts of names, except that
%	the optional suffix is connected directly to the last name, allowing
%	``|as={, Title}|'', for example.
% \end{tablenotes}
% \smallskip
% \hrule\medskip\centering
% {\footnotesize \dots\ continued}
% \end{threeparttable}
% \end{keytable}


% \changes{v2.05}{2021/06/11}{Docs: Fixed \optn{r} key.}

% \begin{keytable}{
%	c={Keys and values — part II},cont,stretch=1.5}
% \centering
% \index{keys>and values}
% \begin{threeparttable}
% \small
% \begin{tabular}{>{\ttfamily}cc>{\raggedright}p{2.5in}>{\centering\arraybackslash}>{\ttfamily\arraybackslash}p{1in}}
% \toprule
% \textrm{Key} & Sub\tnote{c} & Description & \textrm{Example} \\
% \midrule
% lw & --- & Set the width to a fraction of \cs{linewidth}.  Cancels |w|.
% 	If a non-image float, sets the width of the text box.
%   For wrapped objects, may be used with \optn{wlw} for a smaller item
%       with a larger caption.
%           & lw=.5 \\  
% w &  --- & Set the actual width.  Cancels |lw|.
% 	If a non-image float, sets the width of the text box.
%   For wrapped objects, may be used with \optn{ww} for a smaller item
%       with a larger caption.
%           & w=2in \\
% h & --- & Set the actual height, images only.  & w=2in \\
% s & --- & Set the image scale, images only.  & s=3 \\
% r & --- & Set the rotation angle; counter-clockwise degrees. & r=90 \\
% f & --- & Selects a loose frame with the current \cs{fboxsep}.
%	Only rotated with \cs{keyfig}.  & f \\
% ft & --- & Selects a tight frame with no \cs{fboxsep}.  Useful for photographs,
% 	or diagrams which already have some margin built in. & ft \\
% stretch & --- & Sets \cs{arraystretch} inside the float. & stretch=1.5 \\
% mo & --- & Sets the vertical offset for a margin float. & mo=-1.2ex \\
% wn & --- & Sets the number of lines for a wrapped float. & wn=2 \\
% wp & --- & Sets the wrap placement for a wrapped float. The default
%	is |O|, which places the wrapped float at the outside edge of the text.
%	See \cref{tab:wrapplacement}.
%	& wp=I \\
% wo & --- & Sets the wrap overhang for a wrapped float. & wo=8em \\
% wlw & --- & Sets the total width of the wrapped item to a fraction of \cs{linewidth}.
%       May be more than the \optn{w} or \optn{lw} width. & wlw=.6 \\
% ww & --- & Sets the total width of the wrapped item.
%       May be more than the \optn{w} or \optn{lw} width. & ww=2in \\
% va & --- & Sets the vertical alignment of the outermost minipage container for the keyfloat.
%	Defaults to 'c'.
%	& va=t \\
% \bottomrule
% \end{tabular}
% \begin{tablenotes}
% \item[c:] None of the keys in Part II are used in the
%	\env{keysubfigs}, \env{keysubtabs}, and \env{keysubfloats} environments.
% \end{tablenotes}
% \end{threeparttable}
% \end{keytable}
%
% \Cref{tab:keyvals} shows the key/value combinations which are allowed.
% In most cases these may be used in any order and any combination,
% except for the following:
%
% The keys labeled "Sub"\margintag{subfloat keys}
% \index{subfloat>keys}\index{keys>subfloats}
% may be used for the \env{keysubfigs} and
% \env{keysubtabs} environments, which group a number of subfloats together under
% one master float.  The master float has its own caption, label, and text, and
% each subfloat inside the group likewise has its own set of keys.
%
% \env{keyfloats} does not accept any keys at all.\margintag{keyfloats keys}
% \index{keyfloats>keys}\index{keys>keyfloats}
%
% The ``artist'' keys |ap|, |af|, |al|, and |as| are only used by figures.
%
% The |stretch| key increases space between tabular elements.
%
% The rest of the macros
% and environments accept all of the keys, as they each create an individual
% float or subfloat, and each may have its own assigned dimensions and frame.
%
% \Cref{tab:captions} shows the combinations of the caption-related keys
% \margintag{short/long\\caption combinations}
% |c|, |cstar|, and |sc|, and how they control the caption numbering and
% entries in the \acro{LOF}/\acro{LOT}.
% 
%
% \begin{keytable}{c={Caption-related key combinations},l=tab:captions,stretch=1.5}
% \index{caption>options}
% \centering
% \begin{threeparttable}
% \small
% \begin{tabular}{ccccc}
% \toprule
% \multicolumn{3}{c}{\bfseries Keys in Use} & \multicolumn{2}{c}{\bfseries Type of} \\
% \cmidrule(r){1-3}\cmidrule(l){4-5}
% |c| & |cstar| & |sc| & \textbf{Caption}\tnote{a} & \textbf{\LOF\Slash\LOT}\tnote{b} \\
% \cmidrule(r){1-3} \cmidrule(l){4-5}
% \largebullet & — & — & Numbered & Caption \\
% \largebullet & — & \largebullet & Numbered & Short Caption \\
% \midrule
% — & \largebullet & — & Unnumbered & None \\
% — & \largebullet & \largebullet & Unnumbered & Short Caption \\
% \midrule
% — & |cstar={}| & Ignored & None & None \\
% \bottomrule
% \end{tabular}
% \begin{tablenotes}
% \item[a:] Caption: Shows whether the float will
% be numbered, unnumbered, or have no caption.
% \item[b:] \LOF\Slash\LOT: Shows whether the regular or short caption
% will appear in the List of Figures or List of Tables, or if there will be no listing.
% \end{tablenotes}
% \end{threeparttable}
% \end{keytable}
%
%
% \Cref{tab:wrapplacement} shows the wrapped-float placement
% \margintag{wrapped float placement}
% options for the |wp| key
% for floats placed |[W]|.
%
% \begin{keytable}{c={Key \optn{wp}: Wrapped float placement options},l=tab:wrapplacement}
% \index{float>wrapped placement}\index{wrapped float placement}
% \centering
% \begin{tabular}{ccl}
% \toprule
% \multicolumn{2}{c}{Key} & Location \\
% \cmidrule(r){1-2}\cmidrule{3-3}
% r & R & to the right of the text body \\
% l & L & to the left of the text body \\
% i & I & to the inside margin \\
% o & O & to the outside margin \\
% \bottomrule
% \end{tabular}
%
% \raggedright\small
% The un-capitalized key attempts to place the float ``here'', and
% the capitalized key allows \LaTeX\ to try to find the best location.
% The default is |O|.
% \end{keytable}
%
%
% \clearpage
%
% \subsection{Other settings}
%
% \DescribeMacro{\KFLTtightframe} \marg{contents} Frames the contents without separation.
%
% \DescribeMacro{\KFLTlooseframe} \marg{contents} Frames the contents with separation.
%
% These may be used to re-define how contents are framed.  The default
% is a simple \cs{fbox}.
%
% \DescribeLength{\KFLTtightframewidth} Combined width of the frame and separation
%	for each of tight and loose frames.  These settings should be adjusted when
%	changing the frame width and/or separation.  The value should be equivalent
%	to \cs{fboxwidth} plus \cs{fboxsep}.
% \DescribeLength{\KFLTlooseframewidth}
%
% \DescribeLength{\KFLTimageboxwidth} The computed width of the image.
% Useful to enclose an mdframed environment to restrict its width.
% See \cref{ex:customframe}.
%
%
%
%
% \clearpage
%
% \subsection{Examples}
%
%
% \subsubsection{Single floats}
%
%
% \begin{dtxexample}[\Cref{fig:simple}]{Figure with an image from a file}
% \keyfig{c=A \cs{keyfig} with an image,l=fig:simple}{image}
% \end{dtxexample}
%
% This float (\cref{fig:simple}) is shown at its natural size
% \margintag{natural size}
% because no width or height modifiers were specified.  When used alone like this,
% a regular float is created.
% \index{image>natural size}
%
%
% \begin{dtxexample}[\Cref{fig:figbox}]{Figure with arbitrary contents\label{ex:keyfigbox}}
% \keyfigbox{f,c={A \cs{keyfigbox}},l=fig:figbox}
% 	{Some text.  More text. \par  Another paragraph.}
% \end{dtxexample}
%
% The \cs{keyfigbox} creates a figure with a box of arbitrary contents, instead of
% an image from a file.  Its default width is the full \cs{linewidth},\margintag{default width}
% \index{float>default width}
% unless |w| or |lw| keys are used.
%
%
% \begin{dtxexample}[\Cref{fig:environment}]
% {Figure environment with arbitrary contents\label{ex:keyfigure}}
% \begin{keyfigure}{f,c={A \env{keyfigure} environment},
% 	l=fig:environment}
% Arbitrary contents may go here.
% 
% Including multiple paragraphs.
% \end{keyfigure}
% \end{dtxexample}
%
% The \env{keyfigure} environment is preferred over the \cs{keyfigbox} macro when
% multiple lines of contents are to be included.
%
% \begin{dtxexample}[\Cref{tab:simpletable}]{Table macro}
% \keytab{c=A \cs{keytab} table,l=tab:simpletable}{\testtable}
% \end{dtxexample}
%
% Do not try to use tables which overflow the page.
%
% For anything other than a simple table, use the \env{keytable} environment.
% See \cref{ex:keytable}.
%
% For large tables, use the \pkg{longtable} or \pkg{supertabular} packages.
% \margintag{large tables}\index{tables>large}
% \index{troubleshooting>large tables}
%
%
% \begin{dtxexample}[\Cref{tab:environment}]
% {Table environment with arbitrary contents\label{ex:keytable}}
% \begin{keytable}{f,c={A \env{keytable} environment},
% 	l=tab:environment}
% Arbitrary contents may go here.\footnote{A footnote.}
%
% \testtable
% \end{keytable}
% \end{dtxexample}
%
% The \env{keytable} environment is preferred over the \cs{keytab} macro
% since most tables are multi-line creations.
%
% \cs{keytab} centers the table, but \env{keytable} does not.
% Add \cs{centering} if desired.
%
% \clearpage
%
% \begin{dtxexample}[\Cref{fig:options}]{Figure with many options selected}
% \keyfig{
% 	w=2in,ft,r=15,
% 	c=A figure with many options,
% 	sc=A figure with options,
% 	t={Additional text.  Multiple paragraphs may be used.
% 	The entire text is enclosed in braces because a comma
% 	is included. Alignment may be set by using
% 	tags \optn{tc}, \optn{tl}, or \optn{tr}
% 	instead of \optn{t}},
% 	l=fig:options
% }{image}
% \end{dtxexample}
%
% Width is fixed at 2\,in, a tight frame is specified (\cs{fboxsep} of 0\,pt),
% a short caption appears in the List of Figures, and the additional text
% is using the default fully-justified alignment.
%
% Since \cref{fig:options} is a float, it may appear on the following page.
%
%
% \clearpage
%
% \begin{dtxexample}[\Cref{fig:linewidth}]{Using \cs{linewidth}}
% \keyfig{lw=.5,c=Half of \cs{linewidth},l=fig:linewidth}{image}
% \end{dtxexample}
%
% \Cref{fig:linewidth} is half of \cs{linewidth} in size.
% \margintag{\cs{linewidth}}
% \index{image>\cs{linewidth}}\index{\cs{linewidth}}
% \index{subfloat>\cs{linewidth}}\index{keyfloats>\cs{linewidth}}
% When the |lw| key is used inside a \env{keyfloats} or \env{keysubfigs} environment,
% the \cs{linewidth} will be proportional to the sub-box for each element.
% When used alone, such as here, the \cs{linewidth} is the full width of the text on
% this page.
%
% |lw| and |w| are not used at the same time.
% If both |lw| and |w| are specified, the last one cancels any previous ones.
%
%
% \clearpage
%
% \begin{dtxexample}[\Cref%
%     {fig:looseframe,fig:tightframe,tab:looseframe,tab:tightframe}%
% ]{Using frames}
% \begin{keyfloats}[hbp]{4}
% \keyfig{f,c=Loosely-framed figure,l=fig:looseframe}{image}
% \keyfig{ft,c=Tightly-framed figure,l=fig:tightframe}{image}
% \keytab{f,c=Loosely-framed table,l=tab:looseframe}{\testtable}
% \keytab{ft,c=Tightly-framed table,l=tab:tightframe}{\testtable}
% \end{keyfloats}
% \end{dtxexample}
%
% The |f| key adds a loose frame with the current \cs{fboxsep}.
% This is desirable in most cases.
%
% The |tf| key adds a tight frame with no separation.
% This is useful for framing a photograph, or a diagram which already has a margin.
%
% Framing tables is seldom recommended.  In the case of the tight frame, \cref{tab:tightframe},
% note that the external frame almost overwrites the table's natural horizontal rules.
%
% Also see \cref{sec:customframes} for customizing frames.
% \margintag{custom frames}
%
%
% \clearpage
%
% \begin{dtxexample}[\Cref{tab:rotated}]{Using rotation with boxes}
% \keytab{f,w=.8in,c={Table, rotated},
% 	r=70,l=tab:rotated,
% 	tc=(Framed to show box width.)}
% 	{\testwidetable}
% \end{dtxexample}
%
% Unless a width is given, a box is the full \cs{linewidth}.
% \margintag{rotated whitespace}
% When rotated, this extra horizontal space is rotated into extra vertical space.
% \index{rotate>box width and vertical space}\index{\cs{linewidth}>with rotation}
% \index{troubleshooting>rotating>extra space}
% To avoid this extra space, set a |w| or |lw| to be wide enough
% \watchout[box width]
% for the table or other contents,
% but not much wider.  When this box is rotated, it will not take much more
% vertical space than necessary.
%
% Unlike an image, the frame of a box does not rotate with its contents.
% \margintag{frame rotation}\index{frame>rotation}
% \index{troubleshooting>rotating>frame}
%
% \clearpage
%
% \begin{dtxexample}[\Cref{tab:here}, \Cref{fig:here}]{Located [H]ere}
% \keytab[H]{c={A table [H]},l=tab:here}{\testtable}
% \keyfig[H]{f,w=1in,c={A keyfig [H]},l=fig:here}{image}
% \end{dtxexample}
%
% \Cref{tab:here} and \Cref{fig:here} are to be placed ``[H]ere'', and therefore may appear
% \watchout[Out of sequence]
% out-of-sequence with surrounding figures.
% \index{troubleshooting>float out of sequence}
% Place a \cs{clearpage} before or after to re-sync, if necessary.
%
%
% \clearpage
%
% \begin{dtxexample}[See fig: ``A starred caption''.]{Unnumbered float}
% \keyfig[H]{f,cstar={A starred caption}}{image}
% \end{dtxexample}
%
% A starred caption creates a float without a number, and without
% an entry in the List of Figures unless there is a non-empty short caption.
% (See the next example.)
%
% Labels cannot be used when there is no number for a float.
% \watchout[No label]
% \index{troubleshooting>missing label}
%
%
% \begin{dtxexample}
% 	[See fig: ``Starred caption with a short caption''.]
% 	{Unnumbered float with a \acro{LOF} entry}
% \keyfig{
% 	f,cstar={Starred caption with a short caption.},
% 	sc={Starred short caption}
% }{image}
% \end{dtxexample}
%
% A starred caption with a non-empty short caption creates an
% unnumbered entry in the List of Figures.
%
%
% \clearpage
%
% \begin{dtxexample}
% 	[See fig: ``Optional text which is not a caption.'']
% 	{An unnumbered in-text image}
% \keyfig[H]{f,cstar={},
% 	tc={Optional text which is not a caption.}
% }{image2}
% \end{dtxexample}
%
% By using [H] and |cstar={}|, the image is placed inline
% without a number or \acro{LOF} entry.
%
% Also see \cref{ex:keyparbox}.
%
%
% \clearpage
%
% \begin{dtxexample}[\Cref{fig:nexttoparbox}, and the box to its left.]
% 	{A box without a caption.\label{ex:keyparbox}}
% \begin{keyfloats}{2}
% \keyparbox{
% 	f,lw=.5,
% 	tc={A \cs{keyparbox} with no number or label.}
% }{Some contents.}
% \keyfig{c=Next to a \cs{keyparbox},l=fig:nexttoparbox}{image}
% \end{keyfloats}
% \keyparbox[H]{f,lw=.5}{A \cs{keyparbox} [H], outside the row.}
% \end{dtxexample}
%
% A \cs{keyparbox} is a \cs{keyfigbox} with |cstar={}|,
% and is mostly useful as an information box inside a row or a set of subfloats.
%
%
%
%
% \clearpage
%
% \subsubsection{Groups of floats}
%
% \begin{dtxexample}[\Cref{fig:firstinrow} to \Cref{tab:seventhinrow}]{Groups of figures — \env{keyfloats} environment\label{ex:keyfloats}}
% \begin{keyfloats}{2}
% \keyfig{lw=1,f,c={First in a group},
% 	l=fig:firstinrow,tl={\cs{raggedright} text}
% 	}{image}
% \keyparbox{}{\centering A \cs{keyparbox} describing something.
% 	\par With several paragraphs.}
% \begin{keyfloats}{2}
% \keyfig{lw=1,c={Third in a group},
% 	l=fig:thirdinarow}{image}
% \keyfig{lw=1,c={Fourth in a group}}{image2}
% \keyfig{lw=1,c={Fifth in a group}}{image}
% \keyfig{lw=1,c={Sixth in a group},
% 	l=fig:sixthinarow}{image2}
% \end{keyfloats}
% \keytab{c={Seventh in a group},l=tab:seventhinrow}{\testwidetable}
% \end{keyfloats}
% \end{dtxexample}
%
% 
% \Cref{fig:firstinrow} to \cref{tab:seventhinrow} are in a \env{keyfloats} environment.
% Furthermore, \Crefrange{fig:thirdinarow}{fig:sixthinarow} are in an
% additional nested \env{keyfloats} environment, forming a small box of floats inside
% the larger group.
%
% The \env{keyfloats} environment takes an argument for the number of columns.
% Additional floats are automatically placed on following rows.
% Changing the number of columns will cause the floats to automatically readjust as
% necessary.  Leftovers will be centered on the last row.
%
% Note that \cs{linewidth} is adjusted for each row and nested row,
% \watchout[\cs{linewidth}]
% so the |lw| key will need to be changed if a float is moved to a different nesting level.
% \index{troubleshooting>\cs{linewidth}}\index{\cs{linewidth}>subfloats}
% \index{subfloat>\cs{linewidth}}
%
% Fixed-width or fixed-height floats may be too large to fit
% \watchout[image too large]
% if they are moved into a group.
% It is the user's responsibility to adjust |w|, |h|, or |lw| as necessary.
% \index{troubleshooting>image too large}
%
% Keyfloats may be located [H], [M], or located [W] set with half the line width:\\
% \hspace*{2em}|\begin{keyfloats}[H]{2}| \dots
%
% Keyfloats may be starred to span both columns in a two-column format: \\
% \hspace*{2em}|\begin{keyfloats}*{2}| \dots
%
%
% \clearpage
%
% \subsubsection{Subfloats}
%
%
%
%
% \begin{dtxexample}[\Cref{fig:subfigs}]{Subfigures — \env{keysubfigs} environment\label{ex:keysubfigs}}
% \begin{keysubfigs}{3}{c=Subfigures,l=fig:subfigs}
% \keyfig{lw=1,f,c={First subfigure},
% 	l=fig:firstsubfig,t=Some text}{image}
% \keyfig{lw=1,f,r=90,c={Second subfigure},
% 	l=fig:secondsubfig,
% 	t=Lots of lots of lots of lots of text.}
% 	{image2}
% \begin{keyfloats}{1}
% \keyfig{lw=1,f,c={Third subfigure},l=fig:thirdsubfig}{image}
% \keytab{c={Fourth subfigure},l=fig:fourthsubfig}{\testtable}
% \keyfig{lw=.5,f,c={Fifth subfigure},l=fig:fifthsubfig}{image}
% \end{keyfloats}
% \end{keysubfigs}
% \end{dtxexample}
% 
% \Crefrange{fig:firstsubfig}{fig:fifthsubfig} are in
% the \cref{fig:subfigs} \env{keysubfigs} environment.
% The \env{keysubtabs} environment is similar.
% Mixed types have the type of their container, as shown with \cref{fig:fourthsubfig}.
%
% Subfloats are associated floats (a, b, \dots) collected together into one common float
% (the enclosing \env{keysubfigs} or \env{keysubtabs} environment).
% The enclosing float can have its own caption (call ``Sub-Figures'' in the example),
% which appears in the \acro{LOF}/\acro{LOT}, and also a label.
% Each subfloat can have its own caption and label as well, but the
% subcaption does not appear in the \acro{LOF}/\acro{LOT}.
%
% All subfloats are forced to have the same type as
% its containing float.\index{troubleshooting>mixed subfloats}
% \watchout[mixed subfloats]
% A table inside a figure will be labeled as a figure, for example.
% This avoids miss-labeling as each subfloat must clearly be identified
% as a child of its containing float.
%
% \env{keysubfigs} and \env{keysubtabs} may not be used inside\watchout[nested subfloats]
% \index{troubleshooting>nested subfloats}\index{subfloat>nested}
% the \env{keyfloats} environment,
% and cannot be nested inside each other.  (No subfloat |12aa|, |12ab|, |12ba|, etc.)
%
% The \env{keyfloats} environment may be used inside \env{keysubfigs} or
% \margintag{nested keyfloats}\index{keyfloats>nested}
% \env{keysubtabs} to gather subfloats together, such as the
% three right-most figures in \cref{fig:subfigs}.
%
% Subfloats may be located [H], [M], or located [W] set with half the line width: \\
% \hspace*{2em}|\begin{keysubfigs}[H]{3}{|key/vals \dots|}|
% 
% Subfloats may be starred to span both columns in a two-column format: \\
% \hspace*{2em}|\begin{keysubfigs}*{2}{|key/vals \dots|}|
%
%
% \begin{dtxexample}[\Cref{tab:subtabs}]{Subtables [H] — \env{keysubtabs} environment\label{ex:keysubtabs}}
% \begin{keysubtabs}[H]{2}{c=Subtables [H],l=tab:subtabs}
% \keytab{c={First subtable},l=fig:firstsubtab}{\testtable}
% \keytab{c={Second subtable},l=fig:secondsubtab}{\testwidetable}
% \end{keysubtabs}
% \end{dtxexample}
% 
%
%
% \clearpage
%
% \subsubsection{Continued floats}
%
% The |cont| key may be used to generate a ``continued'' float.
% The continued float receives the same number as the previous float,
% and it is assumed that they are the same float, except that
% they are separated for some reason such as size on the page.
%
% The label may be placed in a continued float, and will still
% receive the same float number as the prior non-continued float.
%
% \begin{dtxexample}[\Cref{fig:firstcontinued}]{Continued figure}
% \begin{keyfloats}{2}
% \keyfig{,c=Figure to be continued}{image}
% \keyfig{c={\dots continued},cont,l=fig:firstcontinued}{image2}
% \end{keyfloats}
% \end{dtxexample}
%
%
% \clearpage
% \subsubsection{Continued subfloats}
% 
% The \env{keysubfigs} and \env{keysubtabs} environments may also
% be given the |cont| key.
% The containing environment's float receives the same number as the previous float
% (presumably another subfloat container).
%
% \begin{dtxexample}[\Cref{fig:continuedfigures}]{Continued subfloats}
% \begin{keysubfigs}{2}{c={A set of figures},l=fig:continuedfigures}
% \keyfig{c={First of a set},l=fig:contfirst}{image}
% \keyfig{c={Second of a set},l=fig:contsecond}{image}
% \end{keysubfigs}
% \begin{keysubfigs}{2}{c={\dots continued},cont}
% \keyfig{c={Third of a set},l=fig:contthird}{image2}
% \keyfig{c={Fourth of a set},l=fig:contfourth}{image2}
% \end{keysubfigs}
% \end{dtxexample}
%
%
% \clearpage
% \subsubsection{Margin floats}
% \changes{v0.12}{2016/12/02}{Docs: Margin float examples.}
%
% When a keyfloat is located [M], it will be placed in the margin.
%
% \DescribeClass{tufte-book}
% When the |tufte-book| class is used, its \env{marginfigure} or \env{margintable}
% environments will be used, otherwise \pkg{keyfloat} provides environments
% of the same name and uses those instead.
%
% \begin{dtxexample}[\Cref{fig:marginfigure}]{The \env{marginfigure} environment\label{ex:marginfigure}}
% \begin{marginfigure}
% \centering
% \includegraphics[width=.75\linewidth]{image}
%
% Some text added by hand.
% \caption{A \env{marginfigure}}
% \label{fig:marginfigure}
% \end{marginfigure}
% \end{dtxexample}
%
%
% \begin{dtxexample}[\Cref{fig:margintable}]{The \env{margintable} environment\label{ex:margintable}}
% \begin{margintable}
% \centering
% \testwidetable
% \caption{A \env{margintable}}
% \label{fig:margintable}
% \end{margintable}
% \end{dtxexample}
%
%
% \begin{dtxexample}[\Cref{fig:keyfigm}]{Using \cs{keyfig}\optn{[M]}\label{ex:keyfigm}}
% \keyfig[M]{c={A \cs{keyfig}\optn{[M]}},l=fig:keyfigm,ft,
% 	t=Additional text.
% 	Text text text text text text.
% 
% 	More paragraphs.
% }{image2}
% \end{dtxexample}
%
%
% \begin{dtxexample}[\Cref{tab:keytablem}]
%	{Using \env{keytable}\optn{[M]} and an offset\label{ex:keytablem}}
% \begin{keytable}[M]{c={A \env{keytable}\optn{[M]}},
% 	l=tab:keytablem,mo=-.9in}
% \centering
% \testwidetable
% \end{keytable}
% \end{dtxexample}
%
% A negative offset was used to shift the table upwards
% \margintag{margin float offset}
% to the top of the example.
%
% To set the minimum-allowed distance between \cs{marginpar}s and margin floats:
% \margintag{distance between floats}
% \index{distance between floats}\index{float>distance between}
% \begin{sourceverb}
% \setlength{\marginparpush}{3ex}
% \end{sourceverb}
%
%
%
% \clearpage
% \subsubsection{Wrapped floats}
% \changes{v0.12}{2016/12/03}{Docs: Wrapped float examples.}
%
% \begin{dtxexample}[\Cref{fig:keyfigw,tab:keytabw}]
%	{Using \cs{keyfig}\optn{[W]} and \cs{keytab}\optn{[W]}\label{ex:keyfigw}}
% \keyfig[W]{c={A \cs{keyfig}\optn{[W]}},
% 	l=fig:keyfigw,ft,lw=.4,wp=I, wo=8em, wn=12,
% 	t={.4\cs{linewidth} wide, placed \optn{I}.}
% }{image2}
% \blindtext

% \keytab[W]{c={A \cs{keytab}\optn{[W]}},l=tab:keytabw,w=.75in,
% }{\testtable}
% \blindtext
% \end{dtxexample}
%
% \begin{dtxexample}[\Cref{fig:keyfigboxw} and the \cs{keyparbox}.]
%	{Using \cs{keyfigbox}\optn{[W]} and \cs{keyparbox}\optn{[W]}\label{ex:keyfigboxw}}
% \keyfigbox[W]{c={A \cs{keyfigbox}\optn{[W]}},
% 	l=fig:keyfigboxw,f,lw=.25,wp=I, wn=7,
% 	t=Text text text text text text text text text
% }{The contents.}
% \blindtext

% \keyparbox[W]{w=1in}{A \cs{keyparbox}[W] and some more text.}
% \blindtext
% \end{dtxexample}
%
%
% \begin{dtxexample}[\Cref{fig:keyfigurew,tab:keytablew}]
%	{Using \cs{keyfigure}\optn{[W]} and \cs{keytable}\optn{[W]}\label{ex:keyfiguretablew}}
% \begin{keyfigure}[W]{c={A \cs{keyfigure}\optn{[W]}},
% 	l=fig:keyfigurew,f,w=1.5in, wo=4em,wn=5}
% This is a keyfigure.
% \end{keyfigure}
% \blindtext
%
% \begin{keytable}[W]{c={A \env{keytable}\optn{[W]}},
% 	l=tab:keytablew,w=2in,wp=L,
%   tc=Placed \optn{L} and 2in wide.}
% \centering
% \testwidetable
% \end{keytable}
% \blindtext
% \end{dtxexample}
%
%
% \clearpage
%
% \begin{dtxexample}[\Cref{fig:keywrapfig}]
%	{Using \env{keywrap} with a \cs{keyfig}\label{ex:keywrapkeyfig}}
% \begin{itemize}
% \item First item.
%     Several lines of text text text text text
%     text text text text text text text text.
% \item \begin{keywrap}{.3\linewidth}{\keyfig{%
%       lw=1,c={Keywrap with \cs{keyfig}},l=fig:keywrapfig%
%     }{image}}
%         Second item.
%         Several lines of text text text text text
%         text text text text text text text text text
%         text text text text text text text.
%
%         These paragraphs are inside the \texttt{keywrap}.
%         A vertical gap appears below if the text is not enough to
%         fill the space next to the \cs{keyfig}.
%     \end{keywrap}
%     Outside the \env{wrapfig},\margintag{notes}\
%     but still in the second item.
%     There is no elegant way to place only part of a paragraph
%     inside a \env{keywrap}, and attempting to do so requires
%     manually removing the vertical paragraph skip.
% \item Third item.
% \end{itemize}
% \end{dtxexample}
%
% \clearpage
%
% \begin{dtxexample}[\Cref{fig:keyfigwlw,fig:keyfigww}]
%   {Using wrap width \optn{ww} and \optn{wlw}\label{ex:keyfigwlw}}
% \keyfig[W]{c={A \cs{keyfig}\optn{[W] with \optn{wlw}}},
%   l=fig:keyfigwlw,ft,lw=.15,wlw=.4,wp=I,
%   t={.15\cs{linewidth} wide, in a .4\cs{linewidth} box.}
% }{image2}
% \blindtext[1]
%
% \keyfig[W]{c={A \cs{keyfig}\optn{[W] with \optn{ww}}},
%   l=fig:keyfigww,ft,w=1cm,ww=3cm,wp=I,
%   t={1cm wide, in a 3cm box.}
% }{image2}
% \blindtext[1]
% \end{dtxexample}
%
%
% \clearpage
% \subsubsection{Custom frames}
%
% 
% \begin{dtxexample}[\Cref{fig:customframe,fig:customlooseframe}]
%	{Custom frames with \pkg{mdframed}\label{ex:customframe}}
% \renewcommand{\KFLTtightframe}[1]{%
% \begin{minipage}{\KFLTimageboxwidth}
% \begin{mdtightframe}%
% #1
% \end{mdtightframe}%
% \end{minipage}
% }
% \setlength{\KFLTtightframewidth}{1pt}
%
% \renewcommand{\KFLTlooseframe}[1]{%
% \begin{mdlooseframe}[leftmargin=1.5in,rightmargin=1.5in]%
% #1
% \end{mdlooseframe}%
% }
% \setlength{\KFLTlooseframewidth}{4pt}
%
% \keyfig{ft,c=Custom-framed image,l=fig:customframe,r=90}{image}
% \keyfigbox{f,c=Custom loosely-framed box,
% 	l=fig:customlooseframe}{A loosely-framed box.}
% \end{dtxexample}
%
% \DescribePackage{mdframed}
% \Cref{ex:customframe} shows custom frames
% created with the \pkg{mdframed} package along with \pkg{tikz}.
% Note that \pkg{mdframed} uses the full \cs{linewidth}
% \watchout[\pkg{mdframed} width]
% even if the left/right margins are explicitly set, which
% causes extra vertical space when rotated.
% Because of this, the framed object is enclosed inside a minipage
% whose width is precomputed based on the object itself, then
% set in \cs{KFLTimageboxwidth}.  Any shadow may fall outside this
% box.
% \index{troubleshooting>rotating>extra space}
% \index{troubleshooting>mdframed}
%
% See \cref{sec:customframes} for more details.
%
% \begin{dtxexample}[\Cref{fig:customshadow,fig:customlooseshadow}]
%	{Custom shadows with \pkg{fancybox}\label{ex:customshadow}}
% \renewcommand{\KFLTtightframe}[1]{%
% \setlength{\fboxrule}{.4pt}
% \setlength{\fboxsep}{0pt}
% \setlength{\shadowsize}{2pt}
% \shadowbox{#1}%
% }
% \setlength{\KFLTtightframewidth}{0.4pt}
%
% \renewcommand{\KFLTlooseframe}[1]{%
% \setlength{\fboxrule}{.4pt}
% \setlength{\fboxsep}{3pt}
% \setlength{\shadowsize}{2pt}
% \shadowbox{#1}%
% }
% \setlength{\KFLTlooseframewidth}{3.4pt}
%
% \keyfig{ft,c=Custom shadow,l=fig:customshadow}{image}
% \keyfigbox{f,c=Custom loosely-framed shadow,lw=.5,
% 	l=fig:customlooseshadow}{A loosely-framed shadow box.}
% \end{dtxexample}
%
% \DescribePackage{fancybox}
% \Cref{ex:customshadow} shows custom shadow frames
% created with the \pkg{fancybox} package.
% This combination respects |lw| and |w|.
%
% See \cref{sec:customframes} for more details.
%
%
%
%
%
% \renewcommand{\KFLTtightframe}[1]{%
% \setlength{\fboxsep}{0pt}%
% \setlength{\fboxrule}{.4pt}%
% \fbox{#1}%
% }
% \setlength{\KFLTtightframewidth}{.4pt}
% 
% \renewcommand{\KFLTlooseframe}[1]{%
% \setlength{\fboxsep}{3pt}%
% \setlength{\fboxrule}{.4pt}%
% \fbox{#1}%
% }
% \setlength{\KFLTlooseframewidth}{3.4pt}
%
%
%
%
%
% \clearpage
% \subsubsection{Artist's name}
%
% \begin{dtxexample}[\Cref{fig:artist}]{Artist's name — image}
% \keyfig{ft,ap=Mr.,af=First,al=Last,as={~III},
%	tc={\textit{About the illustration.}},
%	c=Artist's name — image,l=fig:artist}{image}
% \end{dtxexample}
%
%
% \begin{dtxexample}[\Cref{fig:artistpar}]{Artist's name — arbitrary contents}
% \tdartistright
% \begin{keyfigure}{f,ap=Mr.,al=Last,
%	c=Artist's name — arbitrary contents,l=fig:artistpar}
% \centering Some text, a quotation, a TikZ\ diagram —
% anything not an image file.
% \end{keyfigure}
% \tdartistcenter
% \end{dtxexample}
%
% The artist's name and optional prefix/suffix are printed below the figure,
% and an index entry is made for the name in (Last, First) format,
% or (Last) if there is no first name.
% If the \pkg{tocdata} package is loaded, the artist's name is also added to
% the List of Figures, and the \pkg{tocdata} \cs{tdname}\dots\ macros
% may be used to align the name.
%
%
%
% \begin{dtxexample}[\Cref{fig:artistcollection}]{Subfloats with an artist}
% \begin{keysubfigs}{2}{
% 	c=Artist's collection, l=fig:artistcollection,
% 	t={Some fully-justified text just for illustrative purposes,
% 	in case you have use for long explanations.
% 	This text may be the full \cs{linewidth} in size. \par
% 	Multiple paragraphs of text are allowed.},
% 	ap=Prefix,af=First,al=Last,as={, Suffix}
% }
% 	\keyfig{c=Artist's First Work}{image}
% 	\keyfig{c=Artist's Second Work,
% 		tc={Commentary about the work.}}{image2}
% \end{keysubfigs}
% \end{dtxexample}
%
% A group of figures may be placed into a subfloat container,
% which may have its own artist keys and additional text.
% Furthermore, each subfloat inside the collection may also have its
% own artist tags and additional text.
%
%
% \clearpage
%
% \subsection{Customization}
%
% \subsubsection{Custom frames}
% \label{sec:customframes}
%
% \index{frame>custom}
%
% There are two user-redefinable framing macros: \\
% \hspace*{2em}\cs{KFLTtightframe} and \cs{KFLTlooseframe}
%
% A float's contents are placed into a box,
% which is passed to either of these two macros
% depending on the key |f| or |tf|.
%
% Each macro takes one argument and frames it.
%
% Each macro has a associated \LaTeX\ lengths: \\
% \hspace*{2em}\cs{KFLTtightframewidth} and \cs{KFLTlooseframewidth}
%
% These lengths must be redefined to the expected
% total frame width, equal to the frame thickness plus
% separation.
%
% The default definitions are:
% \begin{sourceverb}
% \newcommand{\KFLTtightframe}[1]{%
%   \setlength{\fboxsep}{0pt}%
%   \setlength{\fboxrule}{.4pt}%
%   \fbox{#1}%
% }
% \setlength{\KFLTtightframewidth}{.4pt}
% 
% \newcommand{\KFLTlooseframe}[1]{%
%   \setlength{\fboxsep}{3pt}%
%   \setlength{\fboxrule}{.4pt}%
%   \fbox{#1}%
% }
% \setlength{\KFLTlooseframewidth}{3.4pt}
% \end{sourceverb}
%
% See \cref{ex:customframe} for an example
% created with the \pkg{mdframed} package,
% and \cref{ex:customshadow} for an example
% created with the \pkg{fancybox} package.
%
%
%
% \subsubsection{Distance between floats and rows}
% \index{distance between floats}
% \index{subfloat>distance between}
% \index{float>distance between}
% \index{troubleshooting>rows too close or far}
% To spread out the distance between floats and/or rows of floats
% \margintag{rows too close/far}
% on a busy page, the following settings may be changed.
% The settings used in this documentation are:
% \begin{sourceverb}
% \setlength{\floatsep}{5ex plus 1ex minus 1ex}
% \setlength{\dblfloatsep}{5ex plus 1ex minus 1ex}
% \end{sourceverb}
%
%
% \subsubsection{Formatting the captions}
%
% \index{troubleshooting>caption format}
% To modify the typesetting of the captions, see the \pkg{caption} package.
% \index{caption>formatting}
% The settings used in this documentation are:
% \begin{sourceverb}
% % default applied to margin floats:
% \captionsetup{labelfont={small,bf},textfont={small,bf}}
% 
% \captionsetup[figure]{
% 	style=default, justification=centering,
% 	margin=0pt, parskip=0pt, skip=2ex,
% 	labelfont={small,bf},textfont={small,bf}
% }
% 
% \captionsetup[table]{
% 	style=default, justification=centering,
% 	margin=0pt, parskip=0pt, skip=1ex,
% 	labelfont={small,bf},textfont={small,bf}
% }
% 
% \captionsetup[subfigure]{
% 	style=default, justification=centering,
% 	margin=0pt, parskip=0pt, skip=2ex,
% 	labelfont={small},textfont={small}
% }
% 
% \captionsetup[subtable]{
% 	style=default, justification=centering,
% 	margin=0pt, parskip=0pt, skip=1ex,
% 	labelfont={small},textfont={small}
% }
% \end{sourceverb}



% \clearpage
%
% \StopEventually{\PrintChanges\PrintIndex}
% 
%
%
% \section{Code}
% ^^A *source
%
% \subsection{Older packages}
%
% Ensure that \pkg{tocdata}, if loaded, is new enough:
%    \begin{macrocode}
\@ifpackageloaded{tocdata}{
    \@ifpackagelater{tocdata}{2019/03/21}{}{
        \PackageError{keyfloat}
        {%
            The tocdata package is out of date.\MessageBreak
            Update to tocdata v2.02 2019/03/21 or later\MessageBreak
            to use use this version of keyfloat%
        }
        {%
            Please update the tocdata package.  It's worth it!%
        }
    }
}{}
%    \end{macrocode}
%
% \subsection{Prohibited packages}
%
% Prohibits the use of a certain other packages.
%
% \begin{macro}{\KFLT@@prohibitpackage} \marg{packagename}
%    \begin{macrocode}
\newcommand*{\KFLT@@prohibitpackage}[2]{%
\@ifpackageloaded{#1}
{
    \PackageError{keyfloat}
    {%
        The keyfloat package conflicts with the #1\MessageBreak
        package. Remove #1 to use keyfloat.\MessageBreak
        Alternative(s):\MessageBreak
        \space\space#2%
    }
    {%
        Keyfloat uses the caption, subcaption, newfloat, and wrapfig packages.%
    }
}{}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\KFLT@prohibitpackage} \marg{packagename}
%
% Prohibits the use of another package, both now and also \cs{AtBeginDocument}.
%
% \changes{v2.00}{2019/03/11}{Improved package conflict detection.}
%    \begin{macrocode}
\newcommand*{\KFLT@prohibitpackage}[2]{
    \KFLT@@prohibitpackage{#1}{#2}
    \AtBeginDocument{\KFLT@@prohibitpackage{#1}{#2}}
}
%    \end{macrocode}
% \end{macro}
%
%
% The list of prohibited packages:
% \changes{v2.02}{2021/05/18}{Work with \pkg{float}.}
%    \begin{macrocode}
\KFLT@prohibitpackage{floatrow}{caption and subcaption}
\KFLT@prohibitpackage{subfig}{subcaption}
\KFLT@prohibitpackage{subfigure}{subcaption}
\KFLT@prohibitpackage{subfloat}{subcaption}
\KFLT@prohibitpackage{floatflt}{wrapfig}
%    \end{macrocode}
%
%
%
% \subsection{Required packages}
% \changes{v1.00}{2019/01/08}{Removed \pkg{xifthen} dependency.}
%
% \DescribePackage{etoolbox} v2.6 or later
%	for \cs{BeforeBeginEnvironment}, \cs{AfterEndEnvironment}
%    \begin{macrocode}
\RequirePackage{etoolbox}[2011/01/03]%
%    \end{macrocode}
% \DescribePackage{xparse} Argument processing:
%    \begin{macrocode}
\RequirePackage{xparse}
%    \end{macrocode}
% \DescribePackage{keyval} Key processing:
%    \begin{macrocode}
\RequirePackage{xkeyval}
%    \end{macrocode}
% \DescribePackage{graphicx} For \cs{includegraphics} and \pkg{rotating}:
%    \begin{macrocode}
\RequirePackage{graphicx}
%    \end{macrocode}
% \DescribePackage{caption} Handles all caption-related functions:
%    \begin{macrocode}
\RequirePackage{caption}[2010/10/31]% v3.2 to support \phantomcaption
%    \end{macrocode}
% \DescribePackage{subcaption} Derived from \pkg{caption}, used to handle subfloats:
%    \begin{macrocode}
\RequirePackage{subcaption}
%    \end{macrocode}
% \DescribePackage{calc} Used to compute box width minus frame sep and width.
%    \begin{macrocode}
\RequirePackage{calc}
%    \end{macrocode}
% \DescribePackage{rotating} Provides rotation via the \env{turn} environment:
%    \begin{macrocode}
\RequirePackage{rotating}
%    \end{macrocode}
% \DescribePackage{placeins} Provides \FloatBarrier to process existing floats before adding new ones.
%    \begin{macrocode}
\RequirePackage{placeins}
%    \end{macrocode}
% \DescribePackage{wrapfig} Provides figure wrapping code.
%    \begin{macrocode}
\RequirePackage{wrapfig}
%    \end{macrocode}
%


% \DescribePackage{gettitlestring} Used by \pkg{hyperref} and \pkg{nameref}.
%
% \changes{v0.13}{2017/01/14}{Fix: Expands names in references.}
%
% Expand names used in titles:
%    \begin{macrocode}
\PassOptionsToPackage{expand}{gettitlestring}
%    \end{macrocode}


% Rows of floats are created by a simple \env{minipage} environment,
% instead of relying on a preexisting package.  This proved to be
% advantageous when support was added for multiple rows in one
% environment.
%

% \subsection{In-line figures and tables}

% These macros are commonly used by others.

% \begin{environment}{tablehere} Place a table exactly [H].
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
\ProvideDocumentEnvironment{tablehere}{}
{%
    \vskip\intextsep\noindent%
    \minipage{\linewidth}%
    \def\@captype{table}%
    \normalcolor\reset@font\normalsize%
}%
{\endminipage\vskip\intextsep}%
%    \end{macrocode}
% \end{environment}

% \begin{environment}{figurehere} Place a figure exactly [H].
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
\ProvideDocumentEnvironment{figurehere}{}
{%
    \vskip\intextsep\noindent%
    \minipage{\linewidth}%
    \def\@captype{figure}%
    \normalcolor\reset@font\normalsize%
}%
{\endminipage\vskip\intextsep}%
%    \end{macrocode}
% \end{environment}



% \subsection{Row counting and control}

% Used to count position and wrap at end of each row.


% \DescribeCounter{KFLT@numcols} Columns per row.
%    \begin{macrocode}
\newcounter{KFLT@numcols}
%    \end{macrocode}

% \DescribeCounter{KFLT@thiscol} Column currently processing.
% |0| if not yet in a keyfloats or subfloat.
%
%    \begin{macrocode}
\newcounter{KFLT@thiscol}
%    \end{macrocode}

% \DescribeLength{\KFLT@rowboxwidth} How wide is each box in the row.
%    \begin{macrocode}
\newlength{\KFLT@rowboxwidth}
%    \end{macrocode}





% \subsection{Float key handling}

% \DescribeBoolean{KFLT@cont} Continued float?
%    \begin{macrocode}
\newboolean{KFLT@cont}
%    \end{macrocode}
%
% \DescribeKey[main]{cont} Continued float?
%
%    \begin{macrocode}
\define@key{KFLT@keys}{cont}[true]{\setboolean{KFLT@cont}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@c} Caption storage
%    \begin{macrocode}
\newcommand{\KFLT@c}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeBoolean{KFLT@cstar} Starred caption?
%    \begin{macrocode}
\newboolean{KFLT@cstar}
%    \end{macrocode}
%
% \DescribeKey[main]{c} Caption
%
%    \begin{macrocode}
\define@key{KFLT@keys}{c}{%
    \renewcommand{\KFLT@c}{#1}\setboolean{KFLT@cstar}{false}%
}
%    \end{macrocode}
%
% \DescribeKey[main]{cstar} Caption starred?
%
%    \begin{macrocode}
\define@key{KFLT@keys}{cstar}{%
    \renewcommand{\KFLT@c}{#1}\setboolean{KFLT@cstar}{true}%
}
%    \end{macrocode}
%
% \DescribeKey[main]{sc} Short caption
%
%    \begin{macrocode}
\define@key{KFLT@keys}{sc}{%
    \renewcommand{\KFLT@sc}{#1}%
    \setboolean{KFLT@scgiven}{true}%
}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@sc} Short caption storage
%    \begin{macrocode}
\newcommand{\KFLT@sc}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeBoolean{KFLT@scgiven} Was a short caption given?
%    \begin{macrocode}
\newboolean{KFLT@scgiven}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@type} Float type: ``|figure|'', ``|table|''
%    \begin{macrocode}
\newcommand*{\KFLT@type}{}
%    \end{macrocode}
% \end{macro}
%
%
% \DescribeKey[main]{l} Label
%    \begin{macrocode}
\define@key{KFLT@keys}{l}{\renewcommand{\KFLT@l}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@l} Label storage
%    \begin{macrocode}
\newcommand*{\KFLT@l}{}
%    \end{macrocode}
% \end{macro}
%
%
% For the artist/author keys:
%
% \DescribeKey[main]{ap} Artist prefix
%    \begin{macrocode}
\define@key{KFLT@keys}{ap}{\renewcommand{\KFLT@ap}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@ap} Storage for artist prefix
%    \begin{macrocode}
\newcommand*{\KFLT@ap}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{af} Artist first name
%    \begin{macrocode}
\define@key{KFLT@keys}{af}{\renewcommand{\KFLT@af}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@af} Storage for artist first name
%    \begin{macrocode}
\newcommand*{\KFLT@af}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{al} Artist last name
%    \begin{macrocode}
\define@key{KFLT@keys}{al}{\renewcommand{\KFLT@al}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@al} Storage for artist last name
%    \begin{macrocode}
\newcommand*{\KFLT@al}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{as} Artist suffix
%    \begin{macrocode}
\define@key{KFLT@keys}{as}{\renewcommand{\KFLT@as}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@as} Storage for artist suffix
%    \begin{macrocode}
\newcommand*{\KFLT@as}{}
%    \end{macrocode}
% \end{macro}
%
%
% \DescribeKey[main]{aup} Author prefix
%    \begin{macrocode}
\define@key{KFLT@keys}{aup}{\renewcommand{\KFLT@aup}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@aup} Storage for author prefix
%    \begin{macrocode}
\newcommand*{\KFLT@aup}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{auf} Author first name
%    \begin{macrocode}
\define@key{KFLT@keys}{auf}{\renewcommand{\KFLT@auf}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@auf} Storage for author first name
%    \begin{macrocode}
\newcommand*{\KFLT@auf}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{aul} Author last name
%    \begin{macrocode}
\define@key{KFLT@keys}{aul}{\renewcommand{\KFLT@aul}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@al} Storage for author last name
%    \begin{macrocode}
\newcommand*{\KFLT@aul}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{aus} Author suffix
%    \begin{macrocode}
\define@key{KFLT@keys}{aus}{\renewcommand{\KFLT@aus}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@aus} Storage for author suffix
%    \begin{macrocode}
\newcommand*{\KFLT@aus}{}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%
% \begin{macro}{\KFLT@textalign} Storage for text alignment.
%
% Used for the additional text in the float.
%    \begin{macrocode}
\newcommand*{\KFLT@textalign}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\KFLT@t} Additional text storage
%
% Used for the additional text in the float.
%    \begin{macrocode}
\newcommand{\KFLT@t}{}
%    \end{macrocode}
% \end{macro}
%
%
% Create replacement macros in case \pkg{tocdata} is not loaded:
% \changes{v0.12}{2016/12/02}{Adapts to older version of tocdata.}
% \changes{v2.00}{2019/03/20}{Adjustments for \pkg{tocdata} v2.00.}
%    \begin{macrocode}
\providecommand{\tdartisttextjustify}{}
\providecommand{\tdartisttextcenter}{}
\providecommand{\tdartisttextleft}{}
\providecommand{\tdartisttextright}{}
\providecommand{\tdauthortextjustify}{}
\providecommand{\tdauthortextcenter}{}
\providecommand{\tdauthortextleft}{}
\providecommand{\tdauthortextright}{}
\providecommand{\tdartistjustify}{}
\providecommand{\tdartistcenter}{}
\providecommand{\tdartistleft}{}
\providecommand{\tdartistright}{}
\providecommand{\tdauthorjustify}{}
\providecommand{\tdauthorcenter}{}
\providecommand{\tdauthorleft}{}
\providecommand{\tdauthorright}{}
%    \end{macrocode}
%
% \DescribeKey[main]{t} Additional text, justified alignment.
%    \begin{macrocode}
\define@key{KFLT@keys}{t}{%
    \renewcommand{\KFLT@t}{#1}%
    \renewcommand{\KFLT@textalign}{}%
}
%    \end{macrocode}
%
% \DescribeKey[main]{tc} Additional text, centered alignment.
%    \begin{macrocode}
\define@key{KFLT@keys}{tc}{%
    \renewcommand{\KFLT@t}{#1}%
    \renewcommand{\KFLT@textalign}{\centering}%
}
%    \end{macrocode}
%
% \DescribeKey[main]{tr} Additional text, aligned to the right.
%    \begin{macrocode}
\define@key{KFLT@keys}{tr}{%
    \renewcommand{\KFLT@t}{#1}%
    \renewcommand{\KFLT@textalign}{\raggedleft}%
}
%    \end{macrocode}
%
% \DescribeKey[main]{tl} Additional text, aligned to the left.
%    \begin{macrocode}
\define@key{KFLT@keys}{tl}{%
    \renewcommand{\KFLT@t}{#1}%
    \renewcommand{\KFLT@textalign}{\raggedright}%
}
%    \end{macrocode}
%
%
%
% \DescribeKey[main]{lw} Fraction of \cs{linewidth}
%    \begin{macrocode}
\define@key{KFLT@keys}{lw}{%
    \renewcommand{\KFLT@lw}{#1}%
    \setlength{\KFLT@w}{0pt}%
}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@lw} Fraction of linewidth storage: ``|.5|''
%    \begin{macrocode}
\newcommand*{\KFLT@lw}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{w} Fixed width
%    \begin{macrocode}
\define@key{KFLT@keys}{w}{%
    \setlength{\KFLT@w}{#1}%
    \renewcommand{\KFLT@lw}{}%
}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@w} Width storage: ``3cm''
%    \begin{macrocode}
\newlength{\KFLT@w}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{h} Fixed height
%    \begin{macrocode}
\define@key{KFLT@keys}{h}{\setlength{\KFLT@h}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@h} Height storage: ``2in''
%    \begin{macrocode}
\newlength{\KFLT@h}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{s} Scale
%    \begin{macrocode}
\define@key{KFLT@keys}{s}{\renewcommand{\KFLT@s}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@s} Scale storage: ``3''
%    \begin{macrocode}
\newcommand*{\KFLT@s}{1}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{r} Angle.  90 is counter-clockwise 90 degrees.
%    \begin{macrocode}
\define@key{KFLT@keys}{r}{\renewcommand{\KFLT@r}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@r} Angle storage: ``90''
%    \begin{macrocode}
\newcommand*{\KFLT@r}{0}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{f} Frame the image with \cs{KFLTlooseframe}.
%    \begin{macrocode}
\define@key{KFLT@keys}{f}[true]{\setboolean{KFLT@f}{#1}}
%    \end{macrocode}
%
% \DescribeBoolean{KFLT@f} Frame the image?
%    \begin{macrocode}
\newboolean{KFLT@f}
%    \end{macrocode}

% \DescribeKey[main]{ft} Tightly frame the image using \cs{KFLTtightframe}.
%	This is useful for photographs, or diagrams which
%	already have built-in margins.
%    \begin{macrocode}
\define@key{KFLT@keys}{ft}[true]{\setboolean{KFLT@ft}{#1}}
%    \end{macrocode}
%
% \DescribeBoolean{KFLT@ft} Tightly frame the image?
%    \begin{macrocode}
\newboolean{KFLT@ft}
%    \end{macrocode}


% \DescribeKey[main]{stretch} Set \cs{arraystretch} inside the table environment.
%    \begin{macrocode}
\define@key{KFLT@keys}{stretch}{\renewcommand{\KFLT@stretch}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@stretch} Storage for \cs{arraystretch}.
%    \begin{macrocode}
\newcommand*{\KFLT@stretch}{1}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{mo} Set vertical offset for a margin float.
% \changes{v0.12}{2016/12/03}{Added \optn{mo} key.}
%    \begin{macrocode}
\define@key{KFLT@keys}{mo}{\setlength{\KFLT@mo}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@mo} Storage for the vertical margin offset.
%    \begin{macrocode}
\newlength{\KFLT@mo}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{wn} Set wrap number of narrow lines for a wrapped float.
%
% \changes{v2.04}{2021/06/08}{Added \optn{wn} key.}
%    \begin{macrocode}
\define@key{KFLT@keys}{wn}{\renewcommand{\KFLT@wn}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@wn} Storage for the wrap placement.
%    \begin{macrocode}
\newcommand{\KFLT@wn}{}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{wp} Set wrap placement for a wrapped float.
%
% See \cref{tab:wrapplacement} on \cpageref{tab:wrapplacement}.
% 
% \changes{v0.12}{2016/12/03}{Added \optn{wp} key.}
%    \begin{macrocode}
\define@key{KFLT@keys}{wp}{\renewcommand{\KFLT@wp}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@wp} Storage for the wrap placement.
%    \begin{macrocode}
\newcommand{\KFLT@wp}{O}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{wo} Set wrap overhang for a wrapped float.
%
% \changes{v2.04}{2021/06/08}{Added \optn{wo} key.}
%    \begin{macrocode}
\define@key{KFLT@keys}{wo}{\renewcommand{\KFLT@wo}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@wo} Storage for the wrap placement.
%    \begin{macrocode}
\newcommand{\KFLT@wo}{\wrapoverhang}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{wlw} Wrapped figure, fraction of \cs{linewidth}
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
%    \begin{macrocode}
\define@key{KFLT@keys}{wlw}{%
    \renewcommand{\KFLT@wlw}{#1}%
    \setlength{\KFLT@ww}{0pt}%
}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@wlw} Wrapped figure, fraction of linewidth storage: ``|.5|''
%    \begin{macrocode}
\newcommand*{\KFLT@wlw}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[main]{ww} Wrapped figure, fixed width
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
%    \begin{macrocode}
\define@key{KFLT@keys}{ww}{%
    \setlength{\KFLT@ww}{#1}%
    \renewcommand{\KFLT@wlw}{}%
}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@ww} Wrapped figure, width storage: ``3cm''
%    \begin{macrocode}
\newlength{\KFLT@ww}
%    \end{macrocode}
% \end{macro}


% \DescribeKey[main]{va} Set vertical alignment of the outermost minipage container.
%
% \changes{v0.15}{2017/05/09}{Added vertical alignment key \optn{va}.}
%    \begin{macrocode}
\define@key{KFLT@keys}{va}{\renewcommand{\KFLT@va}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@va} Storage for the vertical alignment.
%    \begin{macrocode}
\newcommand{\KFLT@va}{c}
%    \end{macrocode}
% \end{macro}





% \subsection{Nesting control}

% \DescribeCounter{KFLT@keyfloatdepth} Depth inside a keyfigs environment
%    \begin{macrocode}
\newcounter{KFLT@keyfloatdepth}
\setcounter{KFLT@keyfloatdepth}{0}
%    \end{macrocode}

% \DescribeBoolean{KFLT@inkeysubfloats} Inside a \env{keysubfigs} environment?
%    \begin{macrocode}
\newboolean{KFLT@inkeysubfloats}
\setboolean{KFLT@inkeysubfloats}{false}
%    \end{macrocode}



% \subsection{Subfloat key handling}
%
% These keys are for the container holding a collection of subfigures.

% \DescribeBoolean{KFLT@subgrpcont} Continued float?
%    \begin{macrocode}
\newboolean{KFLT@subgrpcont}{}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{cont} Continued float
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{cont}[true]{%
    \setboolean{KFLT@subgrpcont}{#1}%
}
%    \end{macrocode}

% \begin{macro}{\KFLT@subgrpc} Sub-caption storage
%    \begin{macrocode}
\newcommand{\KFLT@subgrpc}{}
%    \end{macrocode}
% \end{macro}

% \DescribeBoolean{KFLT@subgrpcstart} Sub-caption starred?
%    \begin{macrocode}
\newboolean{KFLT@subgrpcstar}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{c} Caption
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{c}{%
    \renewcommand{\KFLT@subgrpc}{#1}\setboolean{KFLT@subgrpcstar}{false}%
}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{cstar} Starred caption?
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{cstar}{%
    \renewcommand{\KFLT@subgrpc}{#1}\setboolean{KFLT@subgrpcstar}{true}%
}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{sc} Short caption
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{sc}{%
    \renewcommand{\KFLT@subgrpsc}{#1}%
    \setboolean{KFLT@subgrpscgiven}{true}%
}
%    \end{macrocode}

% \begin{macro}{\KFLT@subgrpsc} Sub-shortcaption storage
%    \begin{macrocode}
\newcommand{\KFLT@subgrpsc}{}
%    \end{macrocode}
% \end{macro}

% \DescribeBoolean{KFLT@subgrpscgiven} Sub-shortcaption was given?
%    \begin{macrocode}
\newboolean{KFLT@subgrpscgiven}
%    \end{macrocode}

% \begin{macro}{\KFLT@subgrptype} Subfloats collection type storage:
%	``|figure|'', ``|table|''
%    \begin{macrocode}
\newcommand*{\KFLT@subgrptype}{}
%    \end{macrocode}
% \end{macro}


%
% \DescribeKey[subfloat container]{l} Label
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{l}{\renewcommand{\KFLT@subgrpl}{#1}}
\newcommand*{\KFLT@subgrpl}{}
%    \end{macrocode}
%
%
%
% \begin{macro}{\KFLT@subgrptextalign} Storage for text alignment.
%
% Used for the additional text in the float.
%    \begin{macrocode}
\newcommand*{\KFLT@subgrptextalign}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\KFLT@subgrpt} Additional text storage
%
% Used for the additional text in the float.
%    \begin{macrocode}
\newcommand{\KFLT@subgrpt}{}
%    \end{macrocode}
% \end{macro}
%
%
% \DescribeKey[subfloat container]{t} Additional text — full justification
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{t}{%
    \renewcommand{\KFLT@subgrpt}{#1}%
    \renewcommand{\KFLT@subgrptextalign}{}%
}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{t} Additional text — center justification
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{tc}{%
    \renewcommand{\KFLT@subgrpt}{#1}%
    \renewcommand{\KFLT@subgrptextalign}{\centering}%
}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{t} Additional text — aligned left
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{tl}{%
    \renewcommand{\KFLT@subgrpt}{#1}%
    \renewcommand{\KFLT@subgrptextalign}{\raggedright}%
}
%    \end{macrocode}
%
% \DescribeKey[subfloat container]{t} Additional text — aligned right
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{tr}{%
    \renewcommand{\KFLT@subgrpt}{#1}%
    \renewcommand{\KFLT@subgrptextalign}{\raggedleft}%
}
%    \end{macrocode}
%
%
%
% For the \pkg{tocdata} package:
%
% \DescribeKey[subfloat container]{ap} Artist prefix
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{ap}{\renewcommand{\KFLT@subgrpap}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpap} Storage for artist prefix
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpap}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{af} Artist first name
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{af}{\renewcommand{\KFLT@subgrpaf}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpaf} Storage for artist first name
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpaf}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{al} Artist last name
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{al}{\renewcommand{\KFLT@subgrpal}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpal} Storage for artist last name
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpal}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{as} Artist suffix
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{as}{\renewcommand{\KFLT@subgrpas}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpas} Storage for artist suffix
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpas}{}
%    \end{macrocode}
% \end{macro}

% \DescribeKey[subfloat container]{aup} Author prefix
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{aup}{\renewcommand{\KFLT@subgrpaup}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpaup} Storage for author prefix
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpaup}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{auf} Author first name
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{auf}{\renewcommand{\KFLT@subgrpauf}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpauf} Storage for author first name
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpauf}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{aul} Author last name
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{aul}{\renewcommand{\KFLT@subgrpaul}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpaul} Storage for author last name
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpaul}{}
%    \end{macrocode}
% \end{macro}
%
% \DescribeKey[subfloat container]{aus} Author suffix
%    \begin{macrocode}
\define@key{KFLT@subgrpkeys}{aus}{\renewcommand{\KFLT@subgrpaus}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KFLT@subgrpaus} Storage for author suffix
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpaus}{}
%    \end{macrocode}
% \end{macro}


% \subsection{Computing image width}

% \DescribeLength{\KFLT@imagewidth} Computed width of the image
%    \begin{macrocode}
\newlength{\KFLT@imagewidth}
%    \end{macrocode}

% \DescribeLength{\KFLT@boxwidth} Computed width of the container box
%    \begin{macrocode}
\newlength{\KFLT@boxwidth}
%    \end{macrocode}
%
% \DescribeLength{\KFLT@wrapwidth} Computed width of the wrapped figure
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
%    \begin{macrocode}
\newlength{\KFLT@wrapwidth}
%    \end{macrocode}

%
% \begin{macro}{\KFLT@findwidths} Figure out how wide to make an image and its container
%    \begin{macrocode}
\newcommand*{\KFLT@findwidths}{%
%    \end{macrocode}
%
% Default to a box of full \cs{linewidth} minus the potential frame:
%    \begin{macrocode}
    \ifbool{KFLT@ft}% tight frame?
        {\setlength{\KFLT@boxwidth}{\linewidth - 2\KFLTtightframewidth}}%
        {% not tight frame
            \ifbool{KFLT@f}% loose frame?
                {\setlength{\KFLT@boxwidth}{\linewidth - 2\KFLTlooseframewidth}}%
                {\setlength{\KFLT@boxwidth}{\linewidth}}% no frame
        }% not tight frame
%    \end{macrocode}
%
% Several width options exist.  First see if width was given:
%    \begin{macrocode}
    \ifdimgreater{\KFLT@w}{0pt}%
%    \end{macrocode}
%
%  Width was given:
%    \begin{macrocode}
        {\setlength{\KFLT@imagewidth}{\KFLT@w}}%
        {% width not given
%    \end{macrocode}
%
% Use full \cs{linewidth} or only a fraction:
%    \begin{macrocode}
            \ifcsempty{KFLT@lw}%
                {\setlength{\KFLT@imagewidth}{\KFLT@boxwidth}}%
                {\setlength{\KFLT@imagewidth}{\KFLT@lw\KFLT@boxwidth}}%
        }% width not given
%    \end{macrocode}
%
% The wrap width is the same as the image width, unless specified:
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
%    \begin{macrocode}
    \ifdimgreater{\KFLT@ww}{0pt}%
%    \end{macrocode}
%
%  Width was given:
%    \begin{macrocode}
        {%
            \setlength{\KFLT@wrapwidth}{\KFLT@ww}}%
        {% width not given
%    \end{macrocode}
%
% If \optn{wlw}, use a fraction of line width,
% else if none given use the same as the image width.
%    \begin{macrocode}
            \ifcsempty{KFLT@wlw}%
                {%
                    \setlength{\KFLT@wrapwidth}{\KFLT@imagewidth}}%
                {%
                    \setlength{\KFLT@wrapwidth}{\KFLT@wlw\KFLT@boxwidth}}%
        }% width not given
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Framing and rotation}
%
%
% A user-redefinable macro and length to tightly frame the contents.
%
% \cs{KFLTtightframe} may be redefined to a macro which frames its contents.
% \cs{KFLTtightframewidth} should be redefined to the total width of the new
% frame and its separation.
%
% \begin{macro}{\KFLTtightframe} \marg{contents}
%    \begin{macrocode}
\newcommand{\KFLTtightframe}[1]{%
    \setlength{\fboxsep}{0pt}%
    \setlength{\fboxrule}{.4pt}%
    \fbox{#1}%
}

%    \end{macrocode}
% \end{macro}
%
% \DescribeLength{\KFLTtightframewidth} Must be set to the combined width of
%   the tight frame and separation used by \cs{KFLTtightframe}.
%    \begin{macrocode}
\newlength{\KFLTtightframewidth}
\setlength{\KFLTtightframewidth}{.4pt}
%    \end{macrocode}
%
%
% \begin{macro}{\KFLTlooseframe} \marg{contents}
%
% A user-redefinable macro and length to loosely frame the contents.
%
% \cs{KFLTlooseframe} may be redefined to a macro which frames its contents.
% \cs{KFLTlooseframewidth} should be redefine to the total width of the new
% frame and its separation.
%
%    \begin{macrocode}
\newcommand{\KFLTlooseframe}[1]{%
    \setlength{\fboxsep}{3pt}%
    \setlength{\fboxrule}{.4pt}%
    \fbox{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \DescribeLength{\KFLTlooseframewidth} Must be set to the combined width of
% the loose frame and separation used by \cs{KFLTlooseframe}.
%    \begin{macrocode}
\newlength{\KFLTlooseframewidth}
\setlength{\KFLTlooseframewidth}{3.4pt}
%    \end{macrocode}
%
%
% \begin{macro}{\KFLT@frame} \marg{contents}
%
% Frames the contents according to the |f| key.  To be nested for further processing.
%    \begin{macrocode}
\newcommand{\KFLT@frame}[1]
{%
    \ifbool{KFLT@ft}%
        {\KFLTtightframe{#1}}%
        {% not tightframe
            \ifbool{KFLT@f}%
                {\KFLTlooseframe{#1}}%
                {#1}% no frame
        }% not looseframe
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{KFLT@findenvboxwidth}
% Figures the width of the contents of \cs{KFLT@envbox} plus the frame:
%    \begin{macrocode}
\newcommand{\KFLT@findenvboxwidth}{%
    \settowidth{\KFLTimageboxwidth}{\usebox{\KFLT@envbox}}%
    \ifbool{KFLT@ft}%
        {\addtolength{\KFLTimageboxwidth}{2\KFLTtightframewidth}}%
        {% not tightframe
            \ifbool{KFLT@f}%
                {\addtolength{\KFLTimageboxwidth}{2\KFLTlooseframewidth}}%
                {}% no frame
        }% not looseframe
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
% \subsection{A graphics image from a file}
%
% \begin{macro}{\KFLT@onefigureimage} \marg{filename}
%
% Create an image with size, frame, and turn.
%
% \changes{v2.00}{2019/03/12}{Filename in arg instead of \cs{KFLT@i}.}
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@onefigureimage}{m}%
{%
%    \end{macrocode}
% Several possible combinations of linewidth, width, and height are available,
% and each is treated separately.
% Scaling and width/height are done first, then framing, then rotation.
%    \begin{macrocode}
    \begin{lrbox}{\KFLT@envbox}%
%    \end{macrocode}
% Handle the |lw| key.  If |lw| is used, width and height are ignored.
%    \begin{macrocode}
    \ifdefempty{\KFLT@lw}%
    {% not linewidth
%    \end{macrocode}
% Handle the |w| key, which may be used along with the |h| key:
%    \begin{macrocode}
        \ifdimgreater{\KFLT@w}{0pt}%
        {% width is given
            \ifdimgreater{\KFLT@h}{0pt}%
%    \end{macrocode}
% Width and height are both given:
%    \begin{macrocode}
            {% w and h
                \includegraphics%
                [scale=\KFLT@s,%
                width=\KFLT@imagewidth,height=\KFLT@h]{#1}%
            }% w and h
%    \end{macrocode}
% Only width:
%    \begin{macrocode}
            {% only w
                \includegraphics%
                [scale=\KFLT@s,width=\KFLT@imagewidth]{#1}%
            }% only w
        }% width is given
%    \end{macrocode}
% Width was not given, so maybe handle |h| alone:
%    \begin{macrocode}
        {% width is not given
            \ifdimgreater{\KFLT@h}{0pt}%
%    \end{macrocode}
% |h| was given:
%    \begin{macrocode}
                {\includegraphics[scale=\KFLT@s,height=\KFLT@h]{#1}}%
%    \end{macrocode}
% If none were given, use the image's natural size:
%    \begin{macrocode}
                {\includegraphics[scale=\KFLT@s]{#1}}%
        }% width is not given
    }% not linewidth
    {% linewidth given
        \includegraphics[scale=\KFLT@s,width=\KFLT@imagewidth]{#1}%
    }%
    \end{lrbox}%
    \unskip%
    \KFLT@findenvboxwidth%
    \begin{turn}{\KFLT@r}%
    \KFLT@frame{\usebox{\KFLT@envbox}}%
    \unskip%
    \end{turn}%
}
%    \end{macrocode}
% \end{macro}




% \subsection{Printing the caption}
%
%
% \begin{macro}{\KFLT@dosimplecaption} \marg{star?} \marg{short cap or |-NO VALUE-|} \marg{caption}
%
% Calls \cs{caption} depending on several combinations of star and short captions
% being given.
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@dosimplecaption}{m m m}
{%
    \unskip%
    \IfBooleanTF{#1}% star?
        {\IfValueTF{#2}{\caption*[#2]{#3}}{\caption*{#3}}}%
        {\IfValueTF{#2}{\caption[#2]{#3}}{\caption{#3}}}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% There are two versions of \cs{KFLT@docaption},
% depending on whether \pkg{tocdata} is loaded.
%
%    \begin{macrocode}
\@ifpackageloaded{tocdata}
{% tocdata loaded
%    \end{macrocode}
%
%
% \begin{macro}{\KFLT@@docaption} {1: artist/author} \marg{2: empty or ''u''}
%       \marg{3: star?}
%       \marg{4: short caption} \marg{5: caption}
%       \marg{6: \mainsubarg}
% \changes{v2.00}{2019/03/19}{Factored.}
%    \begin{macrocode}
\newcommand*{\KFLT@@docaption}[6]{%
%    \end{macrocode}
% (\pkg{tocdata} does not expand its text argument before checking for empty.)
%    \begin{macrocode}
\addvspace{\smallskipamount}%
\ifcsempty{KFLT@#6t}{%
    \IfBooleanTF{#3}%
    {%
        \csuse{caption#1}*[#4]{#5}%
            []%
            [\csuse{KFLT@#6a#2p}]%
            {\csuse{KFLT@#6a#2f}}%
            {\csuse{KFLT@#6a#2l}}%
            [\csuse{KFLT@#6a#2s}]%
    }{%
        \csuse{caption#1}[#4]{#5}%
            []%
            [\csuse{KFLT@#6a#2p}]%
            {\csuse{KFLT@#6a#2f}}%
            {\csuse{KFLT@#6a#2l}}%
            [\csuse{KFLT@#6a#2s}]%
    }%
}{%
    \ifcsstring{KFLT@#6textalign}{}{\csuse{td#1textjustify}}{}%
    \ifcsstring{KFLT@#6textalign}{\centering}{\csuse{td#1textcenter}}{}%
    \ifcsstring{KFLT@#6textalign}{\raggedleft}{\csuse{td#1textright}}{}%
    \ifcsstring{KFLT@#6textalign}{\raggedright}{\csuse{td#1textleft}}{}%
    \IfBooleanTF{#3}%
    {%
        \csuse{caption#1}*[#4]{#5}%
            [\csuse{KFLT@#6t}]%
            [\csuse{KFLT@#6a#2p}]%
            {\csuse{KFLT@#6a#2f}}%
            {\csuse{KFLT@#6a#2l}}%
            [\csuse{KFLT@#6a#2s}]%
    }{%
        \csuse{caption#1}[#4]{#5}%
            [\csuse{KFLT@#6t}]%
            [\csuse{KFLT@#6a#2p}]%
            {\csuse{KFLT@#6a#2f}}%
            {\csuse{KFLT@#6a#2l}}%
            [\csuse{KFLT@#6a#2s}]%
    }%
}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\KFLT@docaption} * \oarg{2:short caption} \marg{3:caption} \marg{4: \mainsubarg}
%
% Depending on whether the \pkg{tocdata} package is present,
% and an artist is specified,
% use either \cs{caption} or \cs{captionartist}.
%
% The fourth argument is |{}| if a regular float, or
% |subgrp| if \env{keysubfigs} or \env{keysubtabs}.
%
% See Table \ref{tab:captions} for the possible combinations of
% the caption-related keys: |c|, |cstar|, and |sc|.
%
% \changes{v0.14}{2017/02/09}{Fix: No index entry if no artist given.}
%
% With \pkg{tocdata}:
%
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@docaption}{s o m m}
{%
%    \end{macrocode}
% Is the last name empty?  Assume no artist if so.
%    \begin{macrocode}
    \ifcsempty{KFLT@#4al}%
    {% figure w/o artist
        \ifcsempty{KFLT@#4aul}%
        {% figure w/o artist or author
%    \end{macrocode}
% A figure without an artist or author uses the simple caption.
%    \begin{macrocode}
            \KFLT@dosimplecaption{#1}{#2}{#3}%
        }% figure w/o artist or author
%    \end{macrocode}
% A figure with an author uses the \pkg{tocdata} \cs{captionauthor} macro,
% which also creates an index entry.
%    \begin{macrocode}
        {% figure w/ author
            \KFLT@@docaption{author}{u}{#1}{#2}{#3}{#4}%
        }% figure w/ author
    }% figure w/o artist
    {% figure with an artist
%    \end{macrocode}
% A figure with an artist uses the \pkg{tocdata} \cs{captionartist} macro,
% which also creates an index entry.
%    \begin{macrocode}
        \KFLT@@docaption{artist}{}{#1}{#2}{#3}{#4}%
    }% figure with an artist
}% KFLT@tocdata
}% tocdata loaded
{% no tocdata
%    \end{macrocode}
% \end{macro}
%
% Without \pkg{tocdata}:
%
% \begin{macro}{\KFLT@docaption} * \oarg{2:short caption} \marg{3:caption} \marg{4: \mainsubarg}
% \changes{v2.00}{2019/03/19}{Added support for authors.}
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@docaption}{s o m m}
{%
%    \end{macrocode}
% If \pkg{tocdata} is not loaded, use a simple caption.
%    \begin{macrocode}
    \KFLT@dosimplecaption{#1}{#2}{#3}%
%    \end{macrocode}
% Create an index entry depending on whether there is a last, first name:
%    \begin{macrocode}
    \ifcsempty{KFLT@#4al}%
    {%
        \ifcsempty{KFLT@#4aul}%
        {}%
        {% yes author
            \ifcsempty{KFLT@#4auf}%
                {\index{\csuse{KFLT@#4aul}}}%
                {\index{\csuse{KFLT@#4aul}, \csuse{KFLT@#4auf}}}%
        }% yes author
    }% no artist
    {% yes artist
        \ifcsempty{KFLT@#4af}%
            {\index{\csuse{KFLT@#4al}}}%
            {\index{\csuse{KFLT@#4al}, \csuse{KFLT@#4af}}}%
    }% yes artist
}% KFLT@docaption
}% no tocdata
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@caption} \marg{\mainsubarg}
%
% Caption-creation logic.
%
% The argument is |{}| if a regular float, or
% |subgrp| if \env{keysubfigs} or \env{keysubtabs}.
%
% See Table \ref{tab:captions} for the possible combinations of
% the caption-related keys: |c|, |cstar|, and |sc|.
%    \begin{macrocode}
\newcommand{\KFLT@caption}[1]{%
%    \end{macrocode}
% A starred caption is printed but not numbered.
%    \begin{macrocode}
    \ifbool{KFLT@#1cstar}% starred caption?
%    \end{macrocode}
% This is a starred caption:
%    \begin{macrocode}
    {%starred caption
%    \end{macrocode}
% A key given as |cstar={}| yields a float with no caption at all.
%    \begin{macrocode}
        \ifcsempty{KFLT@#1c}% cstar={}?
        {}%
%    \end{macrocode}
% Non-empty starred caption might have a \acro{LOF} entry
% if it has a short caption |sc| key:
%    \begin{macrocode}
        {% non-empty starred caption
            \ifcsempty{KFLT@#1sc}%
%    \end{macrocode}
% No |sc| short caption, but there is a |cstar|, so no \acro{LOF} entry:
%    \begin{macrocode}
            {}%
%    \end{macrocode}
% Both |cstar| and |sc| were given, so add a \acro{LOF} entry:
% \changes{v2.00}{2019/01/22}{Generalized for float type.}
%    \begin{macrocode}
            {% non-empty cstar and sc:
                \edef\KFLT@listtype{\csuse{KFLT@#1type}}%
                \addcontentsline{\csuse{ext@\KFLT@listtype}}%
                    {\csuse{KFLT@#1type}}{\KFLT@sc}%
            }% non-empty cstar and sc
%    \end{macrocode}
% |cstar| was given, so create an unnumbered caption:
%    \begin{macrocode}
            \KFLT@docaption*{\csuse{KFLT@#1c}}{#1}%
        }%
    }% starred caption
%    \end{macrocode}
% Unstarred caption |c| was given, so number this float:
%    \begin{macrocode}
    {% unstarred caption
        \ifcsempty{KFLT@#1sc}%
        {% no short cap
            \KFLT@docaption{\csuse{KFLT@#1c}}{#1}%
        }% no short cap
        {% short cap
            \KFLT@docaption[\csuse{KFLT@#1sc}]%
            {\csuse{KFLT@#1c}}{#1}%
        }% short cap
%    \end{macrocode}
% Optional label:
%    \begin{macrocode}
        \ifcsempty{KFLT@#1l}%
        {}%
        {\label{\csuse{KFLT@#1l}}}%
    }% unstarred caption
}
%    \end{macrocode}
% \end{macro}


% \subsection{Defaults for a new float}

% \begin{macro}{\KFLT@defaults} Defaults all settings before reading the keys.
%    \begin{macrocode}
\newcommand*{\KFLT@defaults}{%
    \setboolean{KFLT@cont}{false}%
    \renewcommand{\KFLT@c}{}%
    \setboolean{KFLT@cstar}{false}%
    \renewcommand{\KFLT@sc}{}%
    \setboolean{KFLT@scgiven}{false}%
    \renewcommand{\KFLT@type}{figure}%
    \renewcommand{\KFLT@l}{}%
    \renewcommand{\KFLT@ap}{}%
    \renewcommand{\KFLT@af}{}%
    \renewcommand{\KFLT@al}{}%
    \renewcommand{\KFLT@as}{}%
    \renewcommand{\KFLT@aup}{}%
    \renewcommand{\KFLT@auf}{}%
    \renewcommand{\KFLT@aul}{}%
    \renewcommand{\KFLT@aus}{}%
    \renewcommand{\KFLT@t}{}%
    \renewcommand{\KFLT@textalign}{}%
    \renewcommand{\KFLT@lw}{}%
    \setlength{\KFLT@w}{0pt}%
    \setlength{\KFLT@h}{0pt}%
    \renewcommand{\KFLT@s}{1}%
    \renewcommand{\KFLT@r}{0}%
    \setboolean{KFLT@f}{false}%
    \setboolean{KFLT@ft}{false}%
    \renewcommand{\KFLT@stretch}{1}%
    \setlength{\KFLT@mo}{-1.2ex}%
    \renewcommand{\KFLT@wn}{}%
    \renewcommand{\KFLT@wp}{O}%
    \renewcommand{\KFLT@wo}{\wrapoverhang}%
    \renewcommand{\KFLT@wlw}{}%
    \setlength{\KFLT@ww}{0pt}%
    \renewcommand{\KFLT@va}{c}%
}
%    \end{macrocode}
% \end{macro}

% \subsection{Row start/end processing}

% \begin{macro}{\KFLT@maybestartfloatrow} Counts rows
%
% After ending a preexisting row, move to the next row.
% The use of \cs{defcounter} makes this counter change local.
%    \begin{macrocode}
\newcommand*{\KFLT@maybestartfloatrow}{%
    \KFLT@maybeendfloatrow%
    \defcounter{KFLT@thiscol}{\value{KFLT@thiscol}+1}%
}
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@maybeendfloatrow} Counts rows
%
% Adds vertical space then resets to allow the start of a new row.
% The use of \cs{defcounter} makes this counter change local.
%    \begin{macrocode}
\newcommand*{\KFLT@maybeendfloatrow}{%
    \ifnumless{\value{KFLT@thiscol}}{\value{KFLT@numcols}}%
    {}% thiscol < numcols
    {% >=
        \par%
        \addvspace{.75\floatsep}%
        \defcounter{KFLT@thiscol}{0}%
    }%
}%
%    \end{macrocode}
% \end{macro}






% \subsection{Key environment helper macros}


% \begin{macro}{\KFLT@trackrows} Tracks and spaces rows and columns.
%    \begin{macrocode}
\newcommand{\KFLT@trackrows}%
{%
%    \end{macrocode}
% If are nested inside a keyfloats or a subfloat:
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{0}} or%
        bool{KFLT@inkeysubfloats}%
    }%
    {% nested
%    \end{macrocode}
% Tracks row start and end:
%    \begin{macrocode}
        \KFLT@maybestartfloatrow%
%    \end{macrocode}
% Possibly fill space between columns:
%    \begin{macrocode}
        \ifnumgreater{\value{KFLT@thiscol}}{1}%
            {\hfill}%
            {}%
    }% nested
    {}% not nested
}
%    \end{macrocode}
% \end{macro}



% \begin{macro}{\KFLT@addtext} \marg{\mainsubarg}
%
% Adds optional additional text.
%
% The argument is |{}| if a regular float, or
% |subgrp| if \env{keysubfigs} or \env{keysubtabs}.
%
% \changes{v0.11}{2016/12/02}{Improved paragraph handling.}
%
%    \begin{macrocode}
\newcommand{\KFLT@addtext}[1]
{%
%    \end{macrocode}
% Is there text to add?
%    \begin{macrocode}
    \ifcsempty{KFLT@#1t}%
    {}% no text
    {% text to add
        {% local
%    \end{macrocode}
% Add some space, then create a full-width minipage to contain the text:
%    \begin{macrocode}
        \addvspace{\smallskipamount}%
        \begin{minipage}{\linewidth}%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
        \hbadness=10000\relax%
%    \end{macrocode}
% Set the alignment and some text parameters:
%    \begin{macrocode}
        \csuse{KFLT@#1textalign}%
        \footnotesize%
        \setlength{\parskip}{1.5ex}%
        \setlength{\parindent}{0em}%
%    \end{macrocode}
% Typeset the actual text:
%    \begin{macrocode}
        \csuse{KFLT@#1t}%
%    \end{macrocode}
% Close it all out with a little more space:
%    \begin{macrocode}
        \end{minipage}%
        \par\addvspace{2ex}%
        }% local
    }% text to add
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\KFLT@optionalname} \marg{name}
%
% Adds optional artist's name and the following space.
%
%    \begin{macrocode}
\newcommand{\KFLT@optionalname}[1]
{%
    \ifblank{#1}%
        {}%
        {#1~}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\KFLT@addartisttext} \marg{\mainsubarg}
%
% Adds optional additional text.
%
% The argument is |{}| if a regular float, or
% |subgrp| if \env{keysubfigs} or \env{keysubtabs}.
%
% One of two versions is used, depending on whether the \pkg{tocdata}
% package is available.
%
% If \pkg{tocdata} is loaded and this float has an artist or author,
% then the float's artist's information and optional text will be printed
% elsewhere by \cs{KFLT@caption}.  Otherwise, the text is printed here.
%
% Two versions, depending on whether \pkg{tocdata} is loaded:
%    \begin{macrocode}
\@ifpackageloaded{tocdata}
{% tocdata loaded
%    \end{macrocode}
% If \pkg{tocdata} is loaded:
%    \begin{macrocode}
\newcommand{\KFLT@addartisttext}[1]
{%
%    \end{macrocode}
% Only add text if is a figure without an artist or author name.
% If an artist or author is given, the name and text will be added
% by \pkg{tocdata}.
%    \begin{macrocode}
    \ifcsempty{KFLT@#1al}% artist last name
        {%
            \ifcsempty{KFLT@#1aul}% author last name
                {\KFLT@addtext{#1}}
                {}%
        }%
        {}% fig w/ artist: text will be added by \captionartist in \KFLT@caption
}% KFLT@addartisttext
}% tocdata loaded
%    \end{macrocode}
% If \pkg{tocdata} is not loaded, the name and text are added here:
%    \begin{macrocode}
{% tocdata not loaded
%    \end{macrocode}

% Factored from \cs{KFLT@addartisttext}
%    \begin{macrocode}
\newcommand*{\KFLT@@addartisttext}[3]{%
%    \end{macrocode}
% Add space and create the name inside a full-width minipage:
%    \begin{macrocode}
        \addvspace{\medskipamount}%
    \begin{minipage}{\linewidth}%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
    \hbadness=10000\relax%
%    \end{macrocode}
%
% Text alignment is |#3|, and depends on artist or author:
%    \begin{macrocode}
    #3%
%    \end{macrocode}
%
% |#1| is empty or '|subgrp'| \\
% |#2| is empty for artist, `|u|' for author:
%    \begin{macrocode}
    \footnotesize\textsc{%
        \KFLT@optionalname{\csuse{KFLT@#1a#2p}}%
        \KFLT@optionalname{\csuse{KFLT@#1a#2f}}%
        \csuse{KFLT@#1a#2l}%
        \csuse{KFLT@#1a#2s}%
    }%
    \end{minipage}%
    \par\addvspace{2ex}%
}

\newcommand{\KFLT@addartisttext}[1]
{%
%    \end{macrocode}
% Only use the artist information if a last name is given:
%    \begin{macrocode}
    \ifcsempty{KFLT@#1al}%
    {% artist last name not given
        \ifcsempty{KFLT@#1aul}%
        {}% author last name not given
        {% author last name given
            \KFLT@@addartisttext{#1}{u}{\raggedleft}%
        }% author last name given
    }% artist last name not given
    {% artist last name given
        \KFLT@@addartisttext{#1}{}{\centering}%
    }%
%    \end{macrocode}
% Any additional text follows the artist's name:
%    \begin{macrocode}
    \KFLT@addtext{#1}%
}% KFLT@addartisttext
}% tocdata not loaded
%    \end{macrocode}
% \end{macro}


% \DescribeLength{\KFLTimageboxwidth} The computed width of the object.
%
% \changes{v0.13}{2017/01/12}{\cs{KFLTimageboxwidth}: Added.}
%
% This may be used as the width parameter of a minipage to encase the object.
%
%    \begin{macrocode}
\newlength{\KFLTimageboxwidth}
%    \end{macrocode}


% \begin{environment}{KFLT@boxinner}
%
% Typeset the contents in a width which depends on the keys.
%    \begin{macrocode}
\newsavebox{\KFLT@envbox}

\NewDocumentEnvironment{KFLT@boxinner}{}
{% keyboxinner
%    \end{macrocode}
% (Possibly) frame the contents of an \env{lrbox}:
%    \begin{macrocode}
    \begin{lrbox}{\KFLT@envbox}%
%    \end{macrocode}
% Rotate the contents:
%    \begin{macrocode}
    \turn{\KFLT@r}%
%    \end{macrocode}
% Box the contents in the width computed by \cs{KFLT@findwidths}:
%    \begin{macrocode}
    \minipage{\KFLT@imagewidth}%
%    \end{macrocode}
% Spacing inside the box.
% Also default to regular justified text alignment.
%    \begin{macrocode}
    \setlength{\parskip}{2ex}%
    \renewcommand{\arraystretch}{\KFLT@stretch}%
}% keyboxinner
%    \end{macrocode}
% End of the environment:
%    \begin{macrocode}
{% endkeyboxinner
    \endminipage%
%    \end{macrocode}
% End the rotated box:
%    \begin{macrocode}
    \endturn%
%    \end{macrocode}
% Possibly frame:
%    \begin{macrocode}
    \end{lrbox}%
    \KFLT@frame{\usebox{\KFLT@envbox}}%
    \par%
}% endkeyboxinner
%    \end{macrocode}
% \end{environment}


% \begin{macro}{\KFLT@boxkeys} \marg{keys} \marg{float type}
%
% Default the options, adjust for a table, then parse the keys:
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@boxkeys}{+m m}
{%
    \KFLT@defaults%
    \renewcommand{\KFLT@type}{#2}%
    \setkeys{KFLT@keys}{#1}%
}
%    \end{macrocode}
% \end{macro}


% \DescribeBoolean{KFLT@captionistop} Saves the value of \cs{caption@position},
% which may become unreliable if using Komascript and
% \begin{sourceverb}
% \captionsetup[table]{position=above}
% \end{sourceverb}
%
%    \begin{macrocode}
\newbool{KFLT@captionistop}
%    \end{macrocode}


% \begin{macro}{\KFLT@LWR@hook@boxouter} Used by \pkg{lwarp}.
%    \begin{macrocode}
\newcommand*{\KFLT@LWR@hook@boxouter}{}%
%    \end{macrocode}
% \end{macro}


% \begin{environment}{KFLT@boxouter} \marg{star?} \marg{loc}
%
% Boxes the contents of figures and floats.
%
% Not used by subfigures.
%
% \changes{v0.12}{2016/12/03}{[M] and [W] floats.}
% \changes{v0.15}{2017/05/09}{Handle vertical alignment key \optn{va}.}
% \changes{v0.15}{2017/05/12}{Adjustments for \protect\env{keywrap}.}
%    \begin{macrocode}
\NewDocumentEnvironment{KFLT@boxouter}{m m}
{% boxouter
%    \end{macrocode}
% The \env{keyfigure} and \env{keytable} environments handle the contents in one of
% three possible ways, depending on whether it is
% called alone, inside a \env{keyfloats} environment, or
% inside a \env{keysubfigs} or \env{keysubtabs} environment.
%
% Start the new subfigure or subtable, of the given width:
%    \begin{macrocode}
    \ifbool{KFLT@inkeysubfloats}%
    {\csuse{sub\KFLT@type}{\KFLT@rowboxwidth}}% subfloat
%    \end{macrocode}
% If \env{keyfloats}, place the contents inside a \env{minipage}:
%    \begin{macrocode}
    {% not subfloat:
        \ifnumgreater{\value{KFLT@keyfloatdepth}}{0}%
        {% keyfloats
            \ifbool{KFLT@keywrap}%
                {\minipage[t]{\KFLT@rowboxwidth}}%
                {\minipage[\KFLT@va]{\KFLT@rowboxwidth}}%
            \captionsetup*{type=\KFLT@type}%
        }% keyfloats
        {% not keyfloats
%    \end{macrocode}
% A hook for \pkg{lwarp} to set \cs{linewidth}, etc.
%    \begin{macrocode}
            \KFLT@LWR@hook@boxouter%
%    \end{macrocode}
%
% Not a subfloat or \env{keyfloats}, so create a single float.
%
% See if inside a \env{keywrap}.
% If so, force [H] and vertical align top.
%    \begin{macrocode}
            \ifbool{KFLT@keywrap}%
            {%
                \par\addvspace{\baselineskip}%
                \noindent%
                \minipage[t]{\linewidth}%
                \captionsetup{type=\KFLT@type}%
            }%
            {% not a keywrap
%    \end{macrocode}
%
% See if the float should [W]rap:
%
%    \begin{macrocode}
                \ifstrequal{#2}{W}%
%    \end{macrocode}
% Place [W], so create a wrapfloat using the \pkg{wrapfig} package:
%    \begin{macrocode}
                {% [W]
%    \end{macrocode}
%
% Temporarily figure out \cs{KFLT@imagewidth},
% and make the wrapped figure environment as wide as the
% desired image size plus frame:
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
% \changes{v2.04}{2021/06/08}{Added \optn{wn} and \optn{wo}.}
%    \begin{macrocode}
                    \KFLT@findwidths%
%    \end{macrocode}
%
% Expand the arguments for \pkg{wrapfig}:
% \changes{v2.05}{2021/06/11}{No longer patch \pkg{wrapfig} for expansion.}
%    \begin{macrocode}
                    \edef\next{%
                        \noexpand\wrapfloat%
                            {\KFLT@type}[\KFLT@wn]{\KFLT@wp}[\KFLT@wo]%
                            {\KFLT@wrapwidth+2\KFLTlooseframewidth}%
                    }%
                    \next%
%    \end{macrocode}
%    \begin{macrocode}
                    \minipage{\KFLT@wrapwidth+2\KFLTlooseframewidth}%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
                    \hbadness=10000\relax%
%    \end{macrocode}
%    \begin{macrocode}
                    \normalcolor\reset@font\normalsize%
%    \end{macrocode}
%
% Change the interior image to the discovered fixed width.
% \changes{v2.02}{2021/05/27}{Added \optn{ww} and \optn{wlw}.}
%    \begin{macrocode}
                    \renewcommand{\KFLT@lw}{}%
                    \renewcommand{\KFLT@w}{\KFLT@imagewidth}%
                    \renewcommand{\KFLT@wlw}{}%
                    \renewcommand{\KFLT@ww}{0pt}%
                }% [W]
                {% not [W]
%    \end{macrocode}
%
% See if the float should be positioned in the [M]argin:
%    \begin{macrocode}
                    \ifstrequal{#2}{M}%
%    \end{macrocode}
% Place [M], so create a marginfloat:
% \changes{v2.00}{2019/03/18}{Added custom float types.}
%    \begin{macrocode}
                    {% [M]
                        \KFLT@marginfloat[\KFLT@mo]{\KFLT@type}%
                    }% [M]
                    {% not [M]
%    \end{macrocode}
%
% See if the float should be positioned [H]ere:
%    \begin{macrocode}
                        \ifstrequal{#2}{H}%
%    \end{macrocode}
% Place [H], so create an inline minipage:
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
                        {% [H]
                            \vskip\intextsep%
                            \noindent\minipage[\KFLT@va]{\linewidth}%
                            \normalcolor\reset@font\normalsize%
                            \captionsetup{type=\KFLT@type}%
                        }% [H]
%    \end{macrocode}
% Not [H], so create a float:
% For a starred float, make a two-column table in a two-col format.
%    \begin{macrocode}
                        {% not [H]
                            \IfBooleanTF{#1}%
                                {\csuse{\KFLT@type*}[#2]}%
                                {\csuse{\KFLT@type}[#2]}%
                        }% not [H]
                    }% not [M]
                }% not [W]
            }% not keywrap
        }% not keyfloats
    }% not subfloat
%    \end{macrocode}
% Handle a continued float.  Ignored if in a subfloat.
%    \begin{macrocode}
    \ifbool{KFLT@cont}{\ContinuedFloat}{}%
%    \end{macrocode}
% Figure out image and parbox widths for the contents:
%    \begin{macrocode}
    \KFLT@findwidths%
%    \end{macrocode}
% Place the caption above the contents depending on \pkg{caption} \optn{position} option:
% \changes{v2.01}{2019/09/11}{Fix: Positions with \brand{Komascript}.}
%    \begin{macrocode}
    \caption@iftop{\booltrue{KFLT@captionistop}}{\boolfalse{KFLT@captionistop}}%
    \ifbool{KFLT@captionistop}{\KFLT@caption{}}{}%
%    \end{macrocode}
% Typeset the contents:
%    \begin{macrocode}
    \center\unskip%
}% boxouter
%    \end{macrocode}
%
% End of the KFLT@boxouter environment:
%
%    \begin{macrocode}
{% endboxouter
    \endcenter\unskip%
    \addvspace{\smallskipamount}%
%    \end{macrocode}
% Optionally print artist's name and additional text:
%    \begin{macrocode}
    \KFLT@addartisttext{}%
%    \end{macrocode}
% Place the caption below the contents depending on \pkg{caption} \optn{position} option:
% \changes{v2.01}{2019/09/11}{Fix: Positions with \brand{Komascript}.}
%    \begin{macrocode}
    \ifbool{KFLT@captionistop}{}{\KFLT@caption{}}%
%    \end{macrocode}
% If are inside \env{keysubtabs}, end the subtable:
%    \begin{macrocode}
    \ifbool{KFLT@inkeysubfloats}%
    {%
        \csuse{endsub\KFLT@type}%
    }% subfloat
    {% not subfloat
        \ifnumgreater{\value{KFLT@keyfloatdepth}}{0}% keyfloats?
        {%
%    \end{macrocode}
%    \begin{macrocode}
            \endminipage%
        }% keyfloats
        {% not keyfloats
%    \end{macrocode}
%
% Not subfloat or \env{keyfloats}, so is an individual float.
%
% Close the minipage or float:
%
% See if in a \env{keywrap}:
%    \begin{macrocode}
            \ifbool{KFLT@keywrap}{%
                \endminipage%
                \par\addvspace{\baselineskip}%
            }%
            {% not keywrap
%    \end{macrocode}
%
% See if the float should [W]rap:
%    \begin{macrocode}
                \ifstrequal{#2}{W}%
%    \end{macrocode}
% Place [W], so close the wrap float:
%    \begin{macrocode}
                {% [W]
                    \endminipage%
                    \endwrapfloat%
                }% [W]
                {% not[W]
%    \end{macrocode}
%
% See if the float should be positioned in the [M]argin:
%    \begin{macrocode}
                    \ifstrequal{#2}{M}%
%    \end{macrocode}
% [M], so close the marginfloat:
% \changes{v2.00}{2019/03/18}{Added custom float types.}
%    \begin{macrocode}
                    {% [M]
                        \endKFLT@marginfloat%
                    }% [M]
%    \end{macrocode}
% [H] or float:
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
                    {% not [M]
                        \ifstrequal{#2}{H}%
                        {%
                            \endminipage% [H]
                            \vskip\intextsep%
                        }%
                        {% not [H]
                            \IfBooleanTF{#1}% starred float?
                                {\csuse{end\KFLT@type*}}%
                                {\csuse{end\KFLT@type}}%
                        }% not [H]
                    }% not [M]
                }% not [W]
            }% not keywrap
        }% not keyfloats
    }% not subfloat
}% endkeyboxouter
%    \end{macrocode}
% \end{environment}


% \begin{macro}{\KFLT@@ignorespaces} \marg{commandname}
% Only do command if not nested inside something.
% \changes{v2.00}{2019/01/22}{Added.}
%    \begin{macrocode}
\newcommand*{\KFLT@@ignorespaces}[1]{%
    \ifboolexpr{%
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{0}} or%
        bool{KFLT@inkeysubfloats}%
    }{}{\csuse{#1}}%
}
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@ignorespaces}
% Only \cs{ignorespaces} if not nested inside something.
% \changes{v2.00}{2019/01/22}{Added.}
%    \begin{macrocode}
\newcommand*{\KFLT@ignorespaces}{%
    \KFLT@@ignorespaces{ignorespaces}%
}
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@envignorespaces}
% Only \cs{ignorespaces} if not nested inside something.
% \changes{v2.00}{2019/01/22}{Added.}
%    \begin{macrocode}
\newcommand*{\KFLT@envignorespaces}{%
    \KFLT@@ignorespaces{ignorespacesafterend}%
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \cs{KFLT@keyflt} macro}
%
% \begin{macro}{\KFLT@keyflt}
%   \marg{1:star} \marg{2:loc} \marg{3:type} \marg{4:\keyvalsarg} \marg{5:contents}
%
% A lower-level macro to generate a float with its contents.
% This is used by \cs{keyfig} and \cs{keyflt}.
%
% \changes{v2.00}{2019/03/17}{Added.}
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@keyflt}{m m m +m +m}
{%
%    \end{macrocode}
%
% \changes{v2.02}{2021/05/18}{Work with \pkg{float}.}
%    \begin{macrocode}
    \ifcsdef{ftype@#3}{}{%
%    \end{macrocode}
%
%    \begin{macrocode}
        \PackageError{keyfloat}%
        {%
            \protect\keyflt: Invalid float type.\MessageBreak%
            \protect\keyflt*[loc]{type}{keys/values}{contents}\MessageBreak%
            Also, \protect\keyflt\space is not an environment
        }%
        {%
            Check argument order and float type.
        }%
    }%
    \KFLT@ignorespaces%
    \KFLT@trackrows%
    \KFLT@boxkeys{#4}{#3}%
    \begingroup%
    \KFLT@boxouter{#1}{#2}%
    #5%
    \endKFLT@boxouter%
    \endgroup%
    \KFLT@ignorespaces%
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \cs{keyflt} macro}

% \begin{macro}{\keyflt} * \oarg{loc} \marg{type} \marg{\keyvalsarg} \marg{contents}
%
% A user-level macro to generate a float with its contents
% centered inside an inner box.
% This may be used by itself, or inside a \env{keyfloats} or
% \env{keysubtabs} environment.
%
% \changes{v0.12}{2016/12/03}{Group around contents.}
% \changes{v2.00}{2019/03/17}{Added.}
%    \begin{macrocode}
\NewDocumentCommand{\keyflt}{s O{tbp} m +m +m}
{%
    \KFLT@keyflt{#1}{#2}{#3}{#4}{%
        \KFLT@boxinner%
        \centering%
        #5%
        \endKFLT@boxinner%
    }%
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\endkeyflt}
%
% Generates an error in case the user tried to use \cs{keyflt} as an environment.
% \changes{v2.00}{2019/03/17}{Added.}
%    \begin{macrocode}
\def\endkeyflt{%
    \PackageError{keyfloat}
    {%
        \protect\end{keyflt}:\MessageBreak
        \protect\keyflt\space is a macro, not an environment.\MessageBreak
        Perhaps you want the keyfloat environment instead%
    }
    {%
        Use \protect\begin{keyfloat} ... \protect\end{keyfloat}.
    }
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \env{keyfloat} environment}

% \begin{macro}{\KFLT@keyfloatstart} \marg{star?} \marg{loc} \marg{float type} \marg{\keyvalsarg}
% \changes{v2.00}{2019/03/18}{Factored.}
%    \begin{macrocode}
\newcommand{\KFLT@keyfloatstart}[4]{%
    \KFLT@envignorespaces%
    \KFLT@boxkeys{#4}{#3}%
    \KFLT@boxouter{#1}{#2}%
    \KFLT@boxinner%
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\KFLT@keyfloatend}
% \changes{v2.00}{2019/03/18}{Factored.}
%    \begin{macrocode}
\newcommand{\KFLT@keyfloatend}{%
    \endKFLT@boxinner%
    \endKFLT@boxouter%
    \KFLT@envignorespaces%
}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{keyfloat} * \oarg{loc} \marg{float type} \marg{\keyvalsarg}
% \changes{v2.00}{2019/03/18}{Added.}
%    \begin{macrocode}
\NewDocumentEnvironment{keyfloat}{s O{tbp} m +m}
{%
    \KFLT@keyfloatstart{#1}{#2}{#3}{#4}%
}%
{%
    \KFLT@keyfloatend%
}
%    \end{macrocode}
% \end{environment}

% Extra code to track rows outside of the \env{keyfloat} environment,
% \DescribeObject{Before \env{keyfloat}}
% before it starts.  This is done to allow nesting without losing track
% of the prior level.
%
%    \begin{macrocode}
\BeforeBeginEnvironment{keyfloat}{%
    \KFLT@trackrows%
}
%    \end{macrocode}


% \subsection{The \env{keyfigure} environment}

% \begin{environment}{keyfigure} * \oarg{loc} \marg{\keyvalsarg}
%    \begin{macrocode}
\NewDocumentEnvironment{keyfigure}{s O{tbp} +m}
{%
    \KFLT@keyfloatstart{#1}{#2}{figure}{#3}%
}%
{%
    \KFLT@keyfloatend%
}
%    \end{macrocode}
% \end{environment}

% Extra code to track rows outside of the \env{keyfigure} environment,
% \DescribeObject{Before \env{keyfigure}}
% before it starts.  This is done to allow nesting without losing track
% of the prior level.
%
%    \begin{macrocode}
\BeforeBeginEnvironment{keyfigure}{%
    \KFLT@trackrows%
}
%    \end{macrocode}


% \subsection{The \cs{keyfig} macro}

% \begin{macro}{\keyfig} * \oarg{2:loc} \marg{3:\keyvalsarg} \marg{4:image filename}
%
% A user-level macro to generate a figure with an image.
% This may be used by itself, or inside a \env{keyfloats} or
% \env{keysubfigs} environment.
%
% \changes{v2.00}{2019/03/17}{Factored.}
%    \begin{macrocode}
\NewDocumentCommand{\keyfig}{s O{tbp} +m m}
{%
    \KFLT@keyflt{#1}{#2}{figure}{#3}{%
        \KFLT@onefigureimage{#4}%
    }%
}
%    \end{macrocode}
% \end{macro}



% \subsection{The \cs{keyfigbox} macro}

% \begin{macro}{\keyfigbox} * \oarg{loc} \marg{\keyvalsarg} \marg{box contents}
%
% A user-level macro to generate a figure with arbitrary paragraph contents.
% This may be used by itself, or inside a \env{keyfloats} or
% \env{keysubtabs} environment.
%
% \changes{v0.12}{2016/12/03}{Group around contents.}
%    \begin{macrocode}
\NewDocumentCommand{\keyfigbox}{s O{tbp} +m +m}
{%
    \KFLT@ignorespaces%
    \KFLT@trackrows%
    \KFLT@boxkeys{#3}{figure}%
    \begingroup%
    \KFLT@boxouter{#1}{#2}%
    \KFLT@boxinner%
    #4%
    \endKFLT@boxinner%
    \endKFLT@boxouter%
    \endgroup%
    \KFLT@ignorespaces%
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \cs{keyparbox} macro}

% \begin{macro}{\keyparbox} * \oarg{loc} \marg{\keyvalsarg} \marg{box contents}
%
% A user-level macro to generate a figure with arbitrary paragraph contents,
% but no number or caption.
% This is equal to a \cs{keyfigbox} with |cstar={}|.
% This may be used by itself, or inside a \env{keyfloats} or
% \env{keysubtabs} environment.
%
% \changes{v0.12}{2016/12/03}{Group around contents.}
%    \begin{macrocode}
\NewDocumentCommand{\keyparbox}{s O{tbp} +m +m}
{%
    \KFLT@ignorespaces%
    \KFLT@trackrows%
    \KFLT@boxkeys{#3}{figure}%
%    \end{macrocode}
% Force |cstar={}|:
%    \begin{macrocode}
    \renewcommand{\KFLT@c}{}%
    \setboolean{KFLT@cstar}{true}%
%    \end{macrocode}
% Continue like \cs{figbox}:
%    \begin{macrocode}
    \begingroup%
    \KFLT@boxouter{#1}{#2}%
    \KFLT@boxinner%
    #4%
    \endKFLT@boxinner%
    \endKFLT@boxouter%
    \endgroup%
    \KFLT@ignorespaces%
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \cs{keytab} macro}

% \begin{macro}{\keytab} * \oarg{loc} \marg{\keyvalsarg} \marg{tabular contents}
%
% A user-level macro to generate a table with tabular contents.
% This may be used by itself, or inside a \env{keyfloats} or
% \env{keysubtabs} environment.
%
% \changes{v2.00}{2019/03/17}{Factored.}
%    \begin{macrocode}
\NewDocumentCommand{\keytab}{s O{tbp} +m +m}
{%
    \IfBooleanTF{#1}{%
        \keyflt*[#2]{table}{#3}{#4}%
    }{%
        \keyflt[#2]{table}{#3}{#4}%
    }%
}
%    \end{macrocode}
% \end{macro}


% \subsection{The \env{keytable} environment}

% \begin{environment}{keytable} * \oarg{loc} \marg{\keyvalsarg}
%    \begin{macrocode}
\NewDocumentEnvironment{keytable}{s O{tbp} +m}
{%
    \KFLT@keyfloatstart{#1}{#2}{table}{#3}%
}%
{%
    \KFLT@keyfloatend%
}
%    \end{macrocode}
% \end{environment}

% Extra code to track rows outside of the \env{keytable} environment,
% \DescribeObject{Before \env{keytable}}
% before it starts.  This is done to allow nesting without losing track
% of the prior level.
%
%    \begin{macrocode}
\BeforeBeginEnvironment{keytable}{%
    \KFLT@trackrows%
}
%    \end{macrocode}



% \subsection{A row of floats}

% \begin{macro}{\KFLT@nonest} Error message if tried to nest subfloats.
%    \begin{macrocode}
\newcommand*{\KFLT@nonest}{%
    \ifboolexpr{%
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{0}} or
        bool {KFLT@inkeysubfloats}%
    }%
    {%
        \PackageError{keyfloat}%
        {%
            Cannot nest keysubfigs or keysubtabs.\MessageBreak%
            (Not in outer par mode.)%
        }%
        {%
            The subcaption package do not support nested environments,\MessageBreak
            so the keyfloat package cannot place a\MessageBreak
            keysubfigs or keysubtabs environment inside another,\MessageBreak
            or inside a keyfloats.%
        }%
    }%
    {}%
}
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@LWR@hook@keyfloats} Used by \pkg{lwarp}.
%    \begin{macrocode}
\newcommand*{\KFLT@LWR@hook@keyfloats}{}%
%    \end{macrocode}
% \end{macro}


% \begin{environment}{KFLT@LWR@hook@keyfloatsminipage} Modified by \pkg{lwarp}.
%    \begin{macrocode}
\newenvironment*{KFLT@LWR@hook@keyfloatsminipage}[1]
    {\noindent\minipage{#1}}
    {\endminipage}%
%    \end{macrocode}
% \end{environment}


% \begin{environment}{keyfloats} * \oarg{loc} \marg{num columns}
%
% User-level macro to create rows of figures/tables.
% Wrapping occurs after the number of specified columns.
% \env{keyfloats} environments may be nested to create
% a vertical set of figures next to a single larger figure,
% for example.
%
% Place \cs{keyfig}, \cs{keyfigbox}, and \cs{keytab} commands
% inside the \env{keyfloats} environment.
%
% Note that |lw| linewidth keys may need to be adjusted inside
% a \env{keyfloats}, \env{keysubfigs}, or \env{keysubtabs}, since
% \cs{linewidth} changes depending on the number of columns.
% Likewise, manually-selected |w| width and |h| tags may need to be
% adjusted to prevent overflow.
%
% \changes{v0.15}{2017/05/12}{Adjustments for \protect\env{keywrap}.}
%
%    \begin{macrocode}
\NewDocumentEnvironment{keyfloats}{s O{tbp} m}
{%
    \KFLT@envignorespaces%
%    \end{macrocode}
% A hook for \pkg{lwarp} to set \cs{linewidth}, etc.
%    \begin{macrocode}
    \KFLT@LWR@hook@keyfloats%
%    \end{macrocode}
% Track the depth:
%    \begin{macrocode}
    \addtocounter{KFLT@keyfloatdepth}{1}%
%    \end{macrocode}
% If [H], nested, subfloats, or keywrap, use a minipage instead of a float:
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifstrequal{#2}{H}} or
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{1}} or
        bool {KFLT@inkeysubfloats} or
        bool {KFLT@keywrap}%
    }%
%    \end{macrocode}
% Create an inline minipage:
%    \begin{macrocode}
    {% [H] or nested
%    \end{macrocode}
% If nested, use different spacing as was computed in the outer nesting level:
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
        \ifboolexpr{%
            test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{1}} or
            bool {KFLT@inkeysubfloats}
        }%
        {%
            \KFLT@LWR@hook@keyfloatsminipage{\KFLT@rowboxwidth}%
        }%
        {%
            \vskip\intextsep%
            \KFLT@LWR@hook@keyfloatsminipage{\linewidth}%
        }%
%    \end{macrocode}
% Reset font and color:
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
%    \begin{macrocode}
        \normalcolor\reset@font\normalsize%
%    \end{macrocode}
% If inside subfloats, generate subfigures by default:
%    \begin{macrocode}
        \ifbool{KFLT@inkeysubfloats}%
            {}%
            {\captionsetup*{type=figure}}%
    }% [H] or nested
%    \end{macrocode}
% Isn't [H] or nested
%    \begin{macrocode}
    {% See if [W]:
        \ifstrequal{#2}{W}
        {% [W]:
%    \end{macrocode}
% [W]:
% \changes{v2.01}{2019/09/16}{Added \env{keyfloats} [W].}
%    \begin{macrocode}
            \wrapfloat{figure}{O}{.5\linewidth}%
            \minipage{\linewidth}%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
            \hbadness=10000\relax%
%    \end{macrocode}
%    \begin{macrocode}
            \normalcolor\reset@font\normalsize%
        }%
        {% not [H]:
            \ifstrequal{#2}{M}%
            {% [M]:
%    \end{macrocode}
% [M]:
% \changes{v2.01}{2019/09/16}{Added \env{keyfloats} [M].}
%    \begin{macrocode}
                \KFLT@marginfloat{figure}%
            }%
%    \end{macrocode}
% A normal figure:
%    \begin{macrocode}
            {% figure
                \IfBooleanTF{#1}% starred figure, two-col figure in a two-col format
                    {\begin{figure*}[#2]}%
                    {\begin{figure}[#2]}%
            }% figure
        }% not [H]
    }%
%    \end{macrocode}
% Compute the width of each entry:
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{1}} or
        bool {KFLT@inkeysubfloats}
    }%
%    \end{macrocode}
% Nested or subfloats:
%    \begin{macrocode}
        {\setlength{\KFLT@rowboxwidth}{.9\KFLT@rowboxwidth/\real{#3}}}%
%    \end{macrocode}
% Keyfloats:
%    \begin{macrocode}
        {\setlength{\KFLT@rowboxwidth}{.9\linewidth/\real{#3}}}%
%    \end{macrocode}
% Center the contents:
%    \begin{macrocode}
    \centering%
%    \end{macrocode}
% Count columns using \cs{defcounter} for a local effect:
%    \begin{macrocode}
    \defcounter{KFLT@numcols}{#3}%
    \defcounter{KFLT@thiscol}{0}%
}% starting keyfloats environment
%    \end{macrocode}
%
% When ending a \env{keyfloats} environment:
%    \begin{macrocode}
{% ending keyfloats environment
%    \end{macrocode}
% [H] or rows/subfigs? Close a minipage:
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifstrequal{#2}{H}} or
        test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{1}} or
        bool {KFLT@inkeysubfloats} or
        bool {KFLT@keywrap}
    }%
    {% was [H], etc.
        \endKFLT@LWR@hook@keyfloatsminipage%
%         \end{minipage}%
%    \end{macrocode}
% Spacing if nested or not:
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
        \ifboolexpr{
            test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{0}} or
            bool {KFLT@keywrap}
        }%
        {}{% not nested
            \vskip\intextsep%
        }%
    }% was [H], etc.
%    \end{macrocode}
% Not [H]:
%    \begin{macrocode}
    {% not [H], etc.
        \ifstrequal{#2}{W}%
        {% [W]:
%    \end{macrocode}
% [W]:
% \changes{v2.01}{2019/09/16}{Added \env{keyfloats} [W].}
%    \begin{macrocode}
            \endminipage%
            \endwrapfloat%
        }%
        {%
            \ifstrequal{#2}{M}%
            {% [M]:
%    \end{macrocode}
% [M]:
% \changes{v2.01}{2019/09/16}{Added \env{keyfloats} [M].}
%    \begin{macrocode}
                \endKFLT@marginfloat%
            }%
            {% figure
%    \end{macrocode}
% A figure:
%    \begin{macrocode}
                \IfBooleanTF{#1}% starred figure?
                    {\end{figure*}}{\end{figure}}%
            }%
        }%
    }% not [H], etc.
%    \end{macrocode}
% Unnest the environment:
%    \begin{macrocode}
    \addtocounter{KFLT@keyfloatdepth}{-1}%
    \KFLT@envignorespaces%
}
%    \end{macrocode}
% \end{environment}



% Extra code to track rows outside of the \env{keyfloats} environment,
% \DescribeObject{Before \env{keyfloats}}
% before it starts.  This is done to allow nesting without losing track
% of the prior level.
%
%    \begin{macrocode}
\BeforeBeginEnvironment{keyfloats}{%
    \KFLT@trackrows%
}
%    \end{macrocode}


% \subsection{Subfloats}

% \begin{macro}{\KFLT@subgrpdefaults} Sets defaults before reading the keys.
%    \begin{macrocode}
\newcommand*{\KFLT@subgrpdefaults}{%
    \setboolean{KFLT@subgrpcont}{false}%
    \renewcommand{\KFLT@subgrpc}{}%
    \setboolean{KFLT@subgrpcstar}{false}%
    \renewcommand{\KFLT@subgrpsc}{}%
    \setboolean{KFLT@subgrpscgiven}{false}%
    \renewcommand{\KFLT@subgrptype}{figure}%
    \renewcommand{\KFLT@subgrpl}{}%
    \renewcommand{\KFLT@subgrpap}{}%
    \renewcommand{\KFLT@subgrpaf}{}%
    \renewcommand{\KFLT@subgrpal}{}%
    \renewcommand{\KFLT@subgrpas}{}%
    \renewcommand{\KFLT@subgrpaup}{}%
    \renewcommand{\KFLT@subgrpauf}{}%
    \renewcommand{\KFLT@subgrpaul}{}%
    \renewcommand{\KFLT@subgrpaus}{}%
    \renewcommand{\KFLT@subgrpt}{}%
    \renewcommand{\KFLT@subgrptextalign}{}%
}
%    \end{macrocode}
% \end{macro}


% \DescribeBoolean{KFLT@subcaptionistop} Saves the value of \cs{caption@position},
% which may become unreliable if using Komascript and
% \begin{sourceverb}
% \captionsetup[table]{position=above}
% \end{sourceverb}
%
%    \begin{macrocode}
\newbool{KFLT@subcaptionistop}
%    \end{macrocode}



% \begin{macro}{\KFLT@subfloats} \marg{starred?} \marg{loc} \marg{cols} \marg{\keyvalsarg}
%
% \changes{v0.13}{2017/01/16}{Fix: Subfloat type selection.}
% \changes{v0.15}{2017/05/12}{Adjustments for \protect\env{keywrap}.}
%
% Start a subfloat environment
%    \begin{macrocode}
\NewDocumentCommand{\KFLT@subfloats}{m m m +m}
{%
    \KFLT@envignorespaces%
%    \end{macrocode}
% Parse the key-value combinations:
%    \begin{macrocode}
    \setkeys{KFLT@subgrpkeys}{#4}%
%    \end{macrocode}
% Nest the environment:
%    \begin{macrocode}
    \setboolean{KFLT@inkeysubfloats}{true}%
%    \end{macrocode}
% Figure out the width of each subfloat.
% If starred, use the full-page \cs{textwidth}, else use \cs{linewidth}.
% .9 is used to leave a little room between columns.
%    \begin{macrocode}
    \IfBooleanTF{#1}%
        {\setlength{\KFLT@rowboxwidth}{.9\textwidth/\real{#3}}}%
        {\setlength{\KFLT@rowboxwidth}{.9\linewidth/\real{#3}}}%
%    \end{macrocode}
% If [H], or in a \env{keywrap}, create an inline minipage:
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifstrequal{#2}{H}} or
        bool {KFLT@keywrap}
    }%
    {%
        \vskip\intextsep\noindent\begin{minipage}{\linewidth}%
        \normalcolor\reset@font\normalsize%
    }%
%    \end{macrocode}
% Not [H]:
%    \begin{macrocode}
    {%
        \ifstrequal{#2}{W}%
        {% [W]
%    \end{macrocode}
% [W]:
% \changes{v2.01}{2019/09/16}{Added \env{keysubfloats} [W].}
%    \begin{macrocode}
            \wrapfloat{\KFLT@subgrptype}{O}{.5\linewidth}%
            \setlength{\KFLT@rowboxwidth}{.5\KFLT@rowboxwidth}%
            \minipage{\linewidth}%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
            \hbadness=10000\relax%
%    \end{macrocode}
%    \begin{macrocode}
            \normalcolor\reset@font\normalsize%
        }%
        {% not [H]:
            \ifstrequal{#2}{M}%
            {% [M]:
%    \end{macrocode}
% [M]:
% \changes{v2.01}{2019/09/16}{Added \env{keysubfloats} [M].}
%    \begin{macrocode}
                \KFLT@marginfloat{\KFLT@subgrptype}%
                \setlength{\KFLT@rowboxwidth}{.9\marginparwidth/\real{#3}}%
            }% [M]
            {% subfloat
%    \end{macrocode}
% A subfloat:
%    \begin{macrocode}
                \IfBooleanTF{#1}%
                    {\begin{\KFLT@subgrptype*}[#2]}%
                    {\begin{\KFLT@subgrptype}[#2]}%
            }%
        }% not [H]
    }%
%    \end{macrocode}
% Set the caption type:
%    \begin{macrocode}
    \captionsetup*{type=\KFLT@subgrptype}%
%    \end{macrocode}
% Process continued floats:
%    \begin{macrocode}
    \ifbool{KFLT@subgrpcont}%
        {\ContinuedFloat}%
        {}%
%    \end{macrocode}
% Center the contents:
%    \begin{macrocode}
    \center\unskip%
%    \end{macrocode}
% Place the caption above the contents depending on \pkg{caption} \optn{position} option:
% \changes{v2.01}{2019/09/11}{Fix: Positions with \brand{Komascript}.}
%    \begin{macrocode}
    \caption@iftop{\booltrue{KFLT@subcaptionistop}}{\boolfalse{KFLT@subcaptionistop}}%
    \ifbool{KFLT@subcaptionistop}{\KFLT@caption{subgrp}}{}%
%    \end{macrocode}
% Not yet started a row of subfloats.
% The use of \cs{defcounter} makes these changes local.
%    \begin{macrocode}
    \defcounter{KFLT@numcols}{#3}%
    \defcounter{KFLT@thiscol}{0}%
%    \end{macrocode}
% Creat a group for the subfloats.
% Necessary in case they change \cs{tdartisttextcenter}, etc.
%    \begin{macrocode}
    \begingroup%
}
%    \end{macrocode}
% \end{macro}



% \begin{macro}{\KFLT@endsubfloats} \marg{starred?} \marg{loc}
%
% Ends a subfloat environment.
%    \begin{macrocode}
\newcommand*{\KFLT@endsubfloats}[2]{%
%    \end{macrocode}
% End the group containing the subfloats:
%    \begin{macrocode}
    \endgroup%
    \unskip%
    \endcenter%
%    \end{macrocode}
% A little extra space at the bottom:
%    \begin{macrocode}
    \par\addvspace{\bigskipamount}%
%    \end{macrocode}
% Optionally print artist's name and additional text:
%    \begin{macrocode}
    \KFLT@addartisttext{subgrp}%
%    \end{macrocode}
% Place the caption below the contents depending on \pkg{caption} \optn{position} option:
% \changes{v2.01}{2019/09/11}{Fix: Positions with \brand{Komascript}.}
%    \begin{macrocode}
    \ifbool{KFLT@subcaptionistop}{}{\KFLT@caption{subgrp}}%
%    \end{macrocode}
% End the float or minipage:
% \changes{v2.01}{2019/09/14}{Improved vertical space.}
%    \begin{macrocode}
    \ifboolexpr{%
        test {\ifstrequal{#2}{H}} or
        bool{KFLT@keywrap}
    }%
        {\end{minipage}\vskip\intextsep}% was [H]
        {% not [H]:
            \ifstrequal{#2}{W}%
            {% [W]
%    \end{macrocode}
% \changes{v2.01}{2019/09/16}{Added \env{keysubfloats} [W].}
%    \begin{macrocode}
                \endminipage%
                \endwrapfloat%
            }%
            {% not [W]:
                \ifstrequal{#2}{M}%
                {% [M]:
%    \end{macrocode}
% \changes{v2.01}{2019/09/16}{Added \env{keysubfloats} [M].}
%    \begin{macrocode}
                    \endKFLT@marginfloat%
                }% [M]
                {% subfloat
                    \IfBooleanTF{#1}% starred?
                        {\end{\KFLT@subgrptype*}}%
                        {\end{\KFLT@subgrptype}}%
                }%
            }% not [W]
        }% not [H]
%    \end{macrocode}
% Unnest the environment:
%    \begin{macrocode}
    \setboolean{KFLT@inkeysubfloats}{false}%
    \KFLT@envignorespaces%
}
%    \end{macrocode}
% \end{macro}


% \begin{macro}{\KFLT@LWR@hook@keysubfloats} Used by \pkg{lwarp}.
%    \begin{macrocode}
\newcommand*{\KFLT@LWR@hook@keysubfloats}{}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{KFLT@keysubfloats} \marg{star?} \marg{loc} \marg{float type} \marg{numcols} \marg{\keyvalsarg}
%
% A group of subfigures typeset in rows.
%
%    \begin{macrocode}
\NewDocumentEnvironment{KFLT@keysubfloats}{m m m m +m}
{%
%    \end{macrocode}
% Error if trying to nest environments:
%    \begin{macrocode}
    \KFLT@nonest%
%    \end{macrocode}
% A hook for \pkg{lwarp} to set \cs{linewidth}, etc.
%    \begin{macrocode}
    \KFLT@LWR@hook@keysubfloats%
%    \end{macrocode}
% Default the options:
%    \begin{macrocode}
    \KFLT@subgrpdefaults%
%    \end{macrocode}
% Default to figure float type:
%    \begin{macrocode}
    \renewcommand{\KFLT@subgrptype}{#3}%
%    \end{macrocode}
% Start of the environment:
%    \begin{macrocode}
    \KFLT@subfloats{#1}{#2}{#4}{#5}%
}% the start of the environment
%    \end{macrocode}
% end of the environment:
%    \begin{macrocode}
{%
    \KFLT@endsubfloats{#1}{#2}%
}
%    \end{macrocode}
% \end{environment}


% \begin{environment}{keysubfloats} * \oarg{loc} \marg{float type} \marg{numcols} \marg{\keyvalsarg}
%
% A group of subfloats typeset in rows.
%
%    \begin{macrocode}
\NewDocumentEnvironment{keysubfloats}{s O{tbp} m m +m}
{%
    \KFLT@keysubfloats{#1}{#2}{#3}{#4}{#5}%
}{%
    \endKFLT@keysubfloats%
}
%    \end{macrocode}
% \end{environment}


% \begin{environment}{keysubfigs} * \oarg{loc} \marg{numcols} \marg{\keyvalsarg}
%
% A group of subfigures typeset in rows.
%
%    \begin{macrocode}
\NewDocumentEnvironment{keysubfigs}{s O{tbp} m +m}
{%
    \KFLT@keysubfloats{#1}{#2}{figure}{#3}{#4}%
}{%
    \endKFLT@keysubfloats%
}
%    \end{macrocode}
% \end{environment}


% \begin{environment}{keysubtabs} * \oarg{loc} \marg{numcols} \marg{\keyvalsarg}
%
% A group of subtables typeset in rows.
%    \begin{macrocode}
\NewDocumentEnvironment{keysubtabs}{s O{tbp} m +m}
{%
    \KFLT@keysubfloats{#1}{#2}{table}{#3}{#4}%
}{%
    \endKFLT@keysubfloats%
}
%    \end{macrocode}
% \end{environment}
%
%
%
%
%
%
% \subsection{Margin floats}
%
% \begin{environment}{KFLT@marginfloat} \oarg{offset} \marg{type}
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
%    \begin{macrocode}
\newsavebox{\KFLT@marginfloatbox}

\NewDocumentEnvironment{KFLT@marginfloat}{O{-1.2ex} m}
{% start
    \FloatBarrier% keep floats in order
    \KFLT@envignorespaces%
    \begin{lrbox}{\KFLT@marginfloatbox}%
    \begin{minipage}{\marginparwidth}%
    \captionsetup{type=#2}%
    \hbox{}\vspace*{#1}%
    \noindent%
    \normalcolor\reset@font\normalsize%
}% start
{% end
    \end{minipage}%
    \end{lrbox}%
    \marginpar{\usebox{\KFLT@marginfloatbox}}%
    \KFLT@envignorespaces%
}% end
%    \end{macrocode}
% \end{environment}
%
%
% Provided in case \pkg{tufte-book} is not loaded:
%
% \begin{environment}{marginfigure} \oarg{offset}
% \changes{v0.12}{2016/12/03}{Added.}
%    \begin{macrocode}
\ProvideDocumentEnvironment{marginfigure}{O{-1.2ex}}
  {\begin{KFLT@marginfloat}[#1]{figure}}
  {\end{KFLT@marginfloat}}
%    \end{macrocode}
% \end{environment}
%
%
% \begin{environment}{margintable} \oarg{offset}
% \changes{v0.12}{2016/12/03}{Added.}
%    \begin{macrocode}
\ProvideDocumentEnvironment{margintable}{O{-1.2ex}}
  {\begin{KFLT@marginfloat}[#1]{table}}
  {\end{KFLT@marginfloat}}
%    \end{macrocode}
% \end{environment}
%
%
%
%
% \subsection{Wrapped floats}
%
% \DescribeBoolean{KFL@keywrap} Tells the next keyfloat to wrap around some text.
%    \begin{macrocode}
\newboolean{KFLT@keywrap}
\boolfalse{KFLT@keywrap}
%    \end{macrocode}
%
%
% \DescribeLength{\KFLT@keywrapwidth} The width of the object to be wrapped beside the text.
%    \begin{macrocode}
\newlength{\KFLT@keywrapwidth}
%    \end{macrocode}
%
% \DescribeLength{\KFLT@keywrapparskip} The \cs{parskip} outside of the keywrap.
%    \begin{macrocode}
\newlength{\KFLT@keywrapparskip}
%    \end{macrocode}
%
% \DescribeLength{\KFLT@keywrapparindent} The \cs{parindent} outside of the keywrap.
%    \begin{macrocode}
\newlength{\KFLT@keywrapparindent}
%    \end{macrocode}
%
%
% \begin{environment}{keywrap} \marg{width} \marg{keyfloat}
%
% The main text is placed in a minipage to the left,
% and the wrapped content is later placed in another minipage to the right.
%
% \changes{v0.15}{2017/05/11}{Added.}
% \changes{v2.01}{2019/09/11}{Fix: Font and color.}
% \changes{v2.01}{2019/09/16}{Fix: \cs{noindent}.}
%    \begin{macrocode}
\DeclareDocumentEnvironment{keywrap}{m +m}%
{%
    \par\noindent%
    \setlength{\KFLT@keywrapwidth}{\linewidth}%
    \addtolength{\KFLT@keywrapwidth}{-#1}%
    \addtolength{\KFLT@keywrapwidth}{-2em}%
    \minipage[t]{\KFLT@keywrapwidth}%
%
    \setlength{\parskip}{\KFLT@keywrapparskip}%
    \setlength{\parindent}{\KFLT@keywrapparindent}%
    \booltrue{KFLT@keywrap}%
}
{%
    \par%
    \endminipage%
    \hfill%
    \begin{minipage}[t]{#1}%
    \booltrue{KFLT@keywrap}%
    \normalcolor\reset@font\normalsize%
%    \end{macrocode}
%
% Inside this minipage, temporarily prevent underfull \cs{hbox} warnings:
% \changes{v2.02}{2021/05/28}{Avoid underfull \cs{hbox} warning.}
%    \begin{macrocode}
    \hbadness=10000\relax%
%    \end{macrocode}
%    \begin{macrocode}
    #2%
    \par%
    \unskip\vspace{\smallskipamount}%
    \end{minipage}%
    \par%
}

\BeforeBeginEnvironment{keywrap}{%
    \setlength{\KFLT@keywrapparskip}{\parskip}%
    \setlength{\KFLT@keywrapparindent}{\parindent}%
}
%    \end{macrocode}
%
% \end{environment}
%
%
%
%
% \iffalse
%</package>
% \fi
%
%
%
%
% \clearpage
% \pagestyle{plain}
%
% \renewcommand{\partname}{}
% \renewcommand{\thepart}{}
% \part{Change History and Index}
%
%
% \Finale
%
\endinput
