summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/keyfloat
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/keyfloat
Initial commit
Diffstat (limited to 'macros/latex/contrib/keyfloat')
-rw-r--r--macros/latex/contrib/keyfloat/README.txt25
-rw-r--r--macros/latex/contrib/keyfloat/images/image.pdfbin0 -> 5456 bytes
-rw-r--r--macros/latex/contrib/keyfloat/images/image2.pdfbin0 -> 4700 bytes
-rw-r--r--macros/latex/contrib/keyfloat/keyfloat.dtx4511
-rw-r--r--macros/latex/contrib/keyfloat/keyfloat.ins47
-rw-r--r--macros/latex/contrib/keyfloat/keyfloat.pdfbin0 -> 504960 bytes
6 files changed, 4583 insertions, 0 deletions
diff --git a/macros/latex/contrib/keyfloat/README.txt b/macros/latex/contrib/keyfloat/README.txt
new file mode 100644
index 0000000000..f628b5cbd7
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/README.txt
@@ -0,0 +1,25 @@
+The LaTeX keyfloat package
+Provides a key/value interface for generating floats.
+
+v2.00 — 2019/03/21
+Copyright 2016-2019 Brian Dunn — www.BDTechConcepts.com
+
+LaTeX Project Public License, version 1.3
+
+The 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 propor-
+tional to \linewidth, a fixed width and/or height, rotation, scaling, a tight
+or loose frame, an \arraystretch, a continued float, additional supplemental
+text, and an artist/author's name with automatic index entry. When used
+with the tocdata package, the name also appears in the List of Figures.
+
+Floats may be placed into a row environment, and are typeset to fit within
+the given number of columns, continuing to the next row if necessary. Nested
+sub-rows may be used to generate layouts such as two small figures placed
+vertically next to one larger figure.
+
+Subfloats are supported by two environments.
diff --git a/macros/latex/contrib/keyfloat/images/image.pdf b/macros/latex/contrib/keyfloat/images/image.pdf
new file mode 100644
index 0000000000..189b6f02af
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/images/image.pdf
Binary files differ
diff --git a/macros/latex/contrib/keyfloat/images/image2.pdf b/macros/latex/contrib/keyfloat/images/image2.pdf
new file mode 100644
index 0000000000..fdd970604c
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/images/image2.pdf
Binary files differ
diff --git a/macros/latex/contrib/keyfloat/keyfloat.dtx b/macros/latex/contrib/keyfloat/keyfloat.dtx
new file mode 100644
index 0000000000..980abeba9c
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/keyfloat.dtx
@@ -0,0 +1,4511 @@
+%
+% \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> [2019/03/21 v2.00 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}{ff}
+\newunicodechar{fi}{fi}
+\newunicodechar{fl}{fl}
+\newunicodechar{ffi}{ffi}
+\newunicodechar{ffl}{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{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{lipsum}
+
+
+
+\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{1174}
+%
+% \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.}
+
+
+
+
+
+% \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--2019} 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}, and \pkg{wrapfig} packages,
+% \watchout
+% and cannot be used with the
+% \pkg{subfig}, \pkg{subfigure}, \pkg{subfloat}, \pkg{floatrow}, \pkg{float},
+% 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 artist's 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, use 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}
+%
+%
+% \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.
+% See \cref{ex:keyfloats}.
+%
+% \DescribeEnv{keysubfigs} * \oarg{loc} \marg{numcols} \marg{keys} \\
+% A group of subfigures typeset in rows.
+% May not be nested.
+% See \cref{ex:keysubfigs}.
+%
+% \DescribeEnv{keysubtabs} * \oarg{loc} \marg{numcols} \marg{keys} \\
+% A group of subtables typeset in rows.
+% May not be nested.
+% See \cref{ex:keysubtabs}.
+%
+% \DescribeEnv{keysubfloats} * \oarg{loc} \marg{float type} \marg{numcols} \marg{keys} \\
+% A group of subfloats typeset in rows.
+% May not be nested.
+%
+% \DescribeEnv{keywrap} \marg{width of keyfloat} \marg{keyfloat} \\
+% Displays a keyfloat next to an environment of text. Usable inside a list item,
+% where [W] will not work. \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.
+% 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}
+%
+% \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:A name \\
+% 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} and \env{keysubtabs} 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}
+
+
+
+% \begin{keytable}{
+% c={Keys and values — part II},cont,stretch=1.5}
+% \centering
+% \index{keys>and values}
+% \begin{threeparttable}
+% \small
+% \begin{tabular}{>{\ttfamily}c>{\raggedright}p{2.5in}>{\centering\arraybackslash}>{\ttfamily\arraybackslash}p{1in}}
+% \toprule
+% \textrm{Key}\tnote{a} & 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. & lw=.5 \\
+% w & Set the actual width. Cancels |lw|.
+% If a non-image float, sets the width of the text box. & w=2in \\
+% h & Set the actual height, images only. & w=2in \\
+% s & Set the image scale, images only. & s=3 \\
+% a & 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 \\
+% 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 \\
+% va & Sets the vertical alignment of the outermost minipage container for the keyfloat.
+% Defaults to 'c'.
+% & va=t \\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[a:] None of the keys in Part II are used in the
+% \env{keysubfigs} and \env{keysubtabs} 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={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 \texttt{tc}, \texttt{tl}, or \texttt{tr}
+% instead of \texttt{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 positioned [H]: \\
+% \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 \cs{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 \cs{keysubfigs} or \cs{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.
+%
+% \cs{keysubfigs} and \cs{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 \cs{keysubfigs} or
+% \margintag{nested keyfloats}\index{keyfloats>nested}
+% \cs{keysubtabs} to gather subfloats together, such as the
+% three right-most figures in \cref{fig:subfigs}.
+%
+% Subfloats may be located |H|: \\
+% \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}\texttt{[M]}\label{ex:keyfigm}}
+% \keyfig[M]{c={A \cs{keyfig}\texttt{[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}\texttt{[M]} and an offset\label{ex:keytablem}}
+% \begin{keytable}[M]{c={A \env{keytable}\texttt{[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}\texttt{[W]} and \cs{keytab}\texttt{[W]}\label{ex:keyfigw}}
+% \keyfig[W]{c={A \cs{keyfig}\texttt{[W]}},
+% l=fig:keyfigw,ft,lw=.4,wp=I,
+% t={.4\cs{linewidth} wide, placed \texttt{I}.}
+% }{image2}
+% \lipsum[1]
+% \keytab[W]{c={A \cs{keytab}\texttt{[W]}},l=tab:keytabw,w=.75in,
+% }{\testtable}
+% \lipsum[2]
+% \end{dtxexample}
+%
+% \begin{dtxexample}[\Cref{fig:keyfigboxw} and the \cs{keyparbox}.]
+% {Using \cs{keyfigbox}\texttt{[W]} and \cs{keyparbox}\texttt{[W]}\label{ex:keyfigboxw}}
+% \keyfigbox[W]{c={A \cs{keyfigbox}\texttt{[W]}},
+% l=fig:keyfigboxw,f,lw=.25,wp=I,
+% t=Text text text text text text text text text
+% }{The contents.}
+% \lipsum[1]
+% \keyparbox[W]{w=1in}{A \cs{keyparbox}[W] and some more text.}
+% \lipsum[2]
+% \end{dtxexample}
+%
+%
+% \begin{dtxexample}[\Cref{fig:keyfigurew,tab:keytablew}]
+% {Using \cs{keyfigure}\texttt{[W]} and \cs{keytable}[W]\label{ex:keyfiguretablew}}
+% \begin{keyfigure}[W]{c={A \cs{keyfigure}\texttt{[W]}},
+% l=fig:keyfigurew,f,w=1.5in}
+% This is a keyfigure.
+% \end{keyfigure}
+% \lipsum[1]
+%
+% \begin{keytable}[W]{c={A \env{keytable}\texttt{[W]}},
+% l=tab:keytablew,w=2in,wp=L,tc=Placed \texttt{L} and 2in wide.}
+% \centering
+% \testwidetable
+% \end{keytable}
+% \lipsum[2]
+% \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
+% \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}
+%
+%
+% \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:
+% \begin{macrocode}
+\KFLT@prohibitpackage{floatrow}{caption and subcaption}
+\KFLT@prohibitpackage{subfig}{subcaption}
+\KFLT@prohibitpackage{subfigure}{subcaption}
+\KFLT@prohibitpackage{subfloat}{subcaption}
+\KFLT@prohibitpackage{float}{newfloat}
+\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].
+% \begin{macrocode}
+\ProvideDocumentEnvironment{tablehere}{}
+ {\bigbreak\noindent\minipage{\linewidth}\def\@captype{table}}
+ {\endminipage\bigbreak}
+% \end{macrocode}
+% \end{environment}
+
+% \begin{environment}{figurehere} Place a figure exactly [H].
+% \begin{macrocode}
+\ProvideDocumentEnvironment{figurehere}{}
+ {\bigbreak\noindent\minipage{\linewidth}\def\@captype{figure}}
+ {\endminipage\bigbreak}
+% \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 \texttt{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]{wp} Set wrap placement for a wrapped float.
+%
+% See \cref{tab:wrapplacement} on \cpageref{tab:wrapplacement}.
+%
+% \changes{v0.12}{2016/12/03}{Added \texttt{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]{va} Set vertical alignment of the outermost minipage container.
+%
+% \changes{v0.15}{2017/05/09}{Added vertical alignment key \texttt{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 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}
+%
+%
+% \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}
+% \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 \cs{keysubfigs} or \cs{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 \cs{keysubfigs} or \cs{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@wp}{O}%
+ \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 \cs{keysubfigs} or \cs{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}
+% 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 \cs{keysubfigs} or \cs{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}
+% 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}
+
+
+% \begin{macro}{\KFLT@LWR@hook@boxouter} Used by \pkg{lwarp}.
+% \begin{macrocode}
+\newcommand*{\KFLT@LWR@hook@boxouter}{}%
+% \end{macrocode}
+% \end{macro}
+
+% \begin{environment}{KFLT@LWR@hook@boxouter@minipage} Used by \pkg{lwarp}.
+% \begin{macrocode}
+\newenvironment*{KFLT@LWR@hook@boxouter@minipage}[2][]
+ {\minipage[#1]{#2}}
+ {\endminipage}
+% \end{macrocode}
+% \end{environment}
+
+% \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 \protect\texttt{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}%
+ {\KFLT@LWR@hook@boxouter@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%
+ \KFLT@LWR@hook@boxouter@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 from 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:
+% \begin{macrocode}
+ \KFLT@findwidths%
+ \wrapfloat{\KFLT@type}{\KFLT@wp}%
+ {\KFLT@imagewidth+2\KFLTlooseframewidth}%
+% \end{macrocode}
+% Change the interior image to the discovered fixed width.
+% \begin{macrocode}
+ \renewcommand{\KFLT@lw}{}%
+ \renewcommand{\KFLT@w}{\KFLT@imagewidth}%
+ }% [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}%
+ \captionsetup{type=\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:
+% \begin{macrocode}
+ {% [H]
+ \par\addvspace{\baselineskip}%
+ \noindent\minipage[\KFLT@va]{\linewidth}%
+ \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:
+% \begin{macrocode}
+ \caption@iftop{\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:
+% \begin{macrocode}
+ \caption@iftop{}{\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?
+ {%
+ \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}{%
+ \endKFLT@LWR@hook@boxouter@minipage%
+ \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]
+ \endwrapfloat%
+ }% [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 close the marginfloat:
+% \changes{v2.00}{2019/03/18}{Added custom float types.}
+% \begin{macrocode}
+ {% [M]
+ \endKFLT@marginfloat%
+ }% [M]
+ {% not [M]
+ \ifstrequal{#2}{H}%
+ {%
+ \endminipage% [H]
+ \par\addvspace{\baselineskip}%
+ }%
+ {% 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}
+{%
+ \ifcsdef{l@#3}{}{%
+ \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}, \cs{keysubfigs}, or \cs{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:
+% \begin{macrocode}
+ \ifboolexpr{%
+ test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{1}} or
+ bool {KFLT@inkeysubfloats}
+ }%
+ {%
+ \KFLT@LWR@hook@keyfloatsminipage{\KFLT@rowboxwidth}%
+ }%
+ {%
+ \bigbreak%
+ \KFLT@LWR@hook@keyfloatsminipage{\linewidth}%
+ }%
+% \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, so create a figure:
+% \begin{macrocode}
+ {% figure
+ \IfBooleanTF{#1}% starred figure, two-col figure in a two-col format
+ {\begin{figure*}[#2]}%
+ {\begin{figure}[#2]}%
+ }% figure
+% \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:
+% \begin{macrocode}
+ \ifboolexpr{
+ test {\ifnumgreater{\value{KFLT@keyfloatdepth}}{0}} or
+ bool {KFLT@keywrap}
+ }%
+ {}{%
+ \bigbreak%
+ }%
+ }% was [H], etc.
+% \end{macrocode}
+% Was not [H], so close a figure:
+% \begin{macrocode}
+ {% not [H], etc.
+ \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}
+
+
+% \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:
+% \begin{macrocode}
+ \ifboolexpr{%
+ test {\ifstrequal{#2}{H}} or
+ bool {KFLT@keywrap}
+ }%
+ {%
+ \bigbreak\noindent\begin{minipage}{\linewidth}%
+ }%
+% \end{macrocode}
+% Isn't [H], so create a float, possibly starred:
+% \begin{macrocode}
+ {%
+ \IfBooleanTF{#1}%
+ {\begin{\KFLT@subgrptype*}[#2]}%
+ {\begin{\KFLT@subgrptype}[#2]}%
+ }%
+% \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:
+% \begin{macrocode}
+ \caption@iftop{\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:
+% \begin{macrocode}
+ \caption@iftop{}{\KFLT@caption{subgrp}}%
+% \end{macrocode}
+% End the float or minipage:
+% \begin{macrocode}
+ \ifboolexpr{%
+ test {\ifstrequal{#2}{H}} or
+ bool{KFLT@keywrap}
+ }%
+ {\end{minipage}\bigbreak}% was [H]
+ {% not [H]:
+ \IfBooleanTF{#1}% starred?
+ {\end{\KFLT@subgrptype*}}%
+ {\end{\KFLT@subgrptype}}%
+ }% 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}
+% \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%
+}% 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}
+% \changes{v0.15}{2017/05/11}{Added.}
+% \begin{macrocode}
+\DeclareDocumentEnvironment{keywrap}{m +m}
+{%
+ \par%
+ \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}%
+ #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
diff --git a/macros/latex/contrib/keyfloat/keyfloat.ins b/macros/latex/contrib/keyfloat/keyfloat.ins
new file mode 100644
index 0000000000..6bea4e2079
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/keyfloat.ins
@@ -0,0 +1,47 @@
+%% keyfloat.ins
+%% 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.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Brian Dunn.
+%%
+%% This work consists of the files keyfloat.dtx and keyfloat.ins
+%% and the derived file keyfloat.sty.
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/ package }
+\preamble
+This is a generated file.
+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.
+\endpreamble
+\askforoverwritefalse
+\generate{\file{keyfloat.sty}{\from{keyfloat.dtx}{package}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space keyfloat.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file keyfloat.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
diff --git a/macros/latex/contrib/keyfloat/keyfloat.pdf b/macros/latex/contrib/keyfloat/keyfloat.pdf
new file mode 100644
index 0000000000..4319e0db59
--- /dev/null
+++ b/macros/latex/contrib/keyfloat/keyfloat.pdf
Binary files differ