From 19c718e2f6f75fe097980f3d441c2ae6c567c173 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 2 Dec 2016 22:57:05 +0000 Subject: keyfloat (2dec16) git-svn-id: svn://tug.org/texlive/trunk@42622 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/source/latex/keyfloat/keyfloat.dtx | 3493 ++++++++++++++++++++ .../texmf-dist/source/latex/keyfloat/keyfloat.ins | 47 + 2 files changed, 3540 insertions(+) create mode 100644 Master/texmf-dist/source/latex/keyfloat/keyfloat.dtx create mode 100644 Master/texmf-dist/source/latex/keyfloat/keyfloat.ins (limited to 'Master/texmf-dist/source/latex/keyfloat') diff --git a/Master/texmf-dist/source/latex/keyfloat/keyfloat.dtx b/Master/texmf-dist/source/latex/keyfloat/keyfloat.dtx new file mode 100644 index 00000000000..117db6fc025 --- /dev/null +++ b/Master/texmf-dist/source/latex/keyfloat/keyfloat.dtx @@ -0,0 +1,3493 @@ + +% \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 +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{keyfloat} +% [2016/12/02 v0.11 Key/value interface for floats and the subcaption package.] +% +%<*driver> +\documentclass{ltxdoc} + +\newcommand*{\mypackagename}{keyfloat} +\newcommand{\quicksummary}{Provides a key/value interface for generating floats.} + +\usepackage{fourier}% for the \danger symbol + +\usepackage{lmodern} +% \usepackage{libertine} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{textcomp} % provides \degree, \textquotesingle, \textmu + +\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} + +\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[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} +} + + + + +\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{verbatim} +% \usepackage{fancyvrb} + +% \usepackage{comment} +% \excludecomment{testing} + +% \usepackage{morefloats} +% \usepackage{marginfix} + +\usepackage{tocloft} +\setlength{\cftsubsecnumwidth}{3em} +\setlength{\cftsubsubsecindent}{2.8em} +\setlength{\cftsubsubsecnumwidth}{4em} +\setlength{\cftbeforesubsecskip}{1ex} + +% \usepackage{titletoc} + +\usepackage{tocdata}[2016/12/02]% v0.12 or later + + + +\usepackage{titleps} + +\newpagestyle{pageheadfoot}{ + \headrule + \sethead{\pkg{\mypackagename}}{}{\thepage} +% \renewcommand{\makefootrule}{\rule[2.5ex]{\linewidth}{.4pt}} + \setfoot{}{}{} +} + +\pagestyle{pageheadfoot} + + + + +\usepackage[pdftex,bookmarks=true,hidelinks,% +colorlinks,linkcolor=mylinkcolor,urlcolor=myurlcolor,% +pageanchor=true,hyperindex=false, +]{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}% +}} + + +\usepackage{cleveref} + +\newcommand*{\lmacro}[1]{\textbackslash#1} +\newcommand*{\cmds}[1]{\texttt{#1}} +\newcommand*{\env}[1]{\texttt{#1}} +\newcommand*{\pkg}[1]{\textsf{#1}} +\newcommand*{\acro}[1]{\textsc{\lowercase{#1}}} + + + +% \begin{newexample}[cross-reference commands / notes]{caption} +% code listing to be typeset and then executed +% \end{example} +% +% Using a minipage to keep the results on one page, +% reads the code listing as a verbatim input using +% the fancybox package, then displays the code listing +% as a verbatim output, and also executes the code +% and displays the result immediatly +% after the environment, followed by a closing \cs{hrule}. +% A title caption is specified, +% along with optional cross-referencing commands to +% refer to the resulting float if there is one. + +\definecolor{examplerulecolor}{rgb}{.9,.9,.9} + +\NewDocumentEnvironment{newexample}{+O{} m} +{% +% Copy the environment's contents to the file kf_cut.tex: +\VerbatimOut[gobble=2,tabsize=4]{kf_cut.tex}} +{\endVerbatimOut +% Typeset the example: +\addvspace{2ex} +\minipage{\linewidth} +\captionsetup{type=example}% +\bigskip\hrule\medskip +\caption{#2} +\textcolor{examplerulecolor}{\smallskip\hrule} +% Typeset the contents as verbatim: +\VerbatimInput[tabsize=4]{kf_cut.tex} +\unskip +\ifstrempty{#1} +{} +{{\textcolor{examplerulecolor}{\hrule}\medskip\itshape\small #1}} +\par\smallskip\hrule height .8pt\medskip +\endminipage +} + +% Outside of the environment's scope, input the example to generate its output +% and labels: +\AfterEndEnvironment{newexample} +{\par\unskip\input{kf_cut.tex}% +} + + + + + +% Indexing improvements: +\makeatletter + +\newcommand*{\Desc@Type}[1]{\raggedleft{\scriptsize#1}\quad} + +% \Describe@Usage{name}{margin tag}{index tag} +\newcommand*{\Describe@Usage}[3]{% +% \@bsphack% +\leavevmode\marginpar{\Desc@Type{#2}\texttt{#1}}% +\index{#1\actualchar{\protect\ttfamily#1} (#3)\encapchar usage}% +\index{#3s:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar usage}% +% \@esphack% +\ignorespaces% +} + +% \Describe@CmdUsage{name}{margin tag}{index tag} +% where name is a \macro +\newcommand*{\Describe@CmdUsage}[3]{% +% \@bsphack% +\leavevmode\marginpar{\Desc@Type{#2}\cmd{#1}}% +\SpecialIndex@{#1}{ (#3)\encapchar usage}% +\index{#3s:\levelchar\cmd{#1}\encapchar usage}\ignorespaces% +% \@esphack% +\ignorespaces% +} + +\newcommand*{\DescribeCommand}[1]{\Describe@Usage{#1}{Cmd}{command}} +\newcommand*{\DescribeFile}[1]{\Describe@Usage{#1}{File}{file}} +\newcommand*{\DescribePackage}[1]{\Describe@Usage{#1}{Pkg}{package}} +\newcommand*{\DescribeOption}[1]{\Describe@Usage{#1}{Opt}{option}} +\newcommand*{\DescribeArgument}[1]{\Describe@Usage{#1}{Arg}{argument}} +\newcommand*{\DescribeBoolean}[1]{\Describe@Usage{#1}{Bool}{boolean}} +\newcommand*{\DescribeLength}[1]{\Describe@CmdUsage{#1}{Len}{length}} +\newcommand*{\DescribeCounter}[1]{\Describe@Usage{#1}{Ctr}{counter}} +\newcommand*{\DescribeSimple}[1]{\leavevmode\marginpar{\raggedleft\texttt{#1}}\index{#1=\texttt{#1}}\ignorespaces} +\renewcommand{\PrintEnvName}[1]{\strut \MacroFont {\scriptsize{}Env\quad}#1\ } +\renewcommand{\PrintDescribeEnv}[1]{\strut \MacroFont {\scriptsize{}Env\quad}#1\ } + +\newcommand*{\DescribeKey}[1]{% +\Describe@Usage{#1}{Key}{key}% +} + + +\newcommand{\margintag}[1]{% +\marginpar{\raggedleft\textcolor{blue!70!black}{#1}}% +\ignorespaces% +} + +\makeatother + + +% \newcommand*{\tikz}{Ti\textit{k}z} +\newcommand*{\htmlfive}{\acro{HTML}\oldstylenums{5}} +\newcommand*{\cssthree}{\acro{CSS}\oldstylenums{3}} + +\newcommand*{\goesto}{$\Rightarrow$} + +\newenvironment{docsidebar}[1][] +{\par\addvspace{1.5ex}% +\hfill\minipage{.9\linewidth}\raggedright#1\smallskip\hrule\medskip} +{\smallskip\hrule\endminipage\hspace*{\fill}\par\addvspace{1.5ex}} + +\makeatletter +\newcommand{\watchout}[1][]{% +\@bsphack% +\marginpar{\hspace*{\fill}%\includegraphics[height=3ex]{symbol_warning.pdf} +\textcolor{DarkRed}{\large\danger\normalsize\quad#1}}% +\@esphack% +} +\makeatother + + + + +% \setlength{\marginparsep}{1em} +% \setlength{\marginparpush}{.7ex} +\setlength{\parindent}{0em} +\setlength{\parskip}{2ex} +\setlength{\IndexMin}{40ex} + + + +\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}{\texttt{\{\}} or \texttt{subgrp}} +\newcommand{\keyvalsarg}{keys/values} + +\setlength{\floatsep}{5ex plus 1ex minus 1ex} +\setlength{\dblfloatsep}{5ex plus 1ex minus 1ex} + + + +\usepackage{\mypackagename} + +\setcounter{IndexColumns}{2} + +\DisableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{\mypackagename.dtx} +\end{document} +% +% +% +% \fi +% +% \iffalse +%<*package> +% \fi +% +% \CheckSum{0} +% +% \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} + + + +% \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\copyright{} 2016} 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\copyright{} 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, and floats [H]. +% +% 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 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. +% +% +% \bigskip +% +% \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}| +% \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 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{verbatim} +% \begin{figure} +% \centering +% \includegraphics[width=3in]{filename} +% \caption{A Figure} +% \label{fig:somelabel} +% \end{figure} +% \end{verbatim} +% \unskip +% +% When doing that often enough, it makes sense to factor the common code: +% \begin{verbatim} +% \onefigure[3in]{filename}{A Figure}{fig:somelabel} +% \end{verbatim} +% \unskip +% +% Expanding the capability of \cs{onefigure} via \pkg{xparse} can lead to the general case of: +% \begin{verbatim} +% \onefigure*[loc](width){filename}(add'l text)[shortcap]{caption}*[label] +% \end{verbatim} +% \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 made 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 the sharing of keys with subfloats as well. +% Thus, the \pkg{keyfloat} package. +% +% \subsection{The \pkg{keyfloat} Package} +% +% Using \pkg{keyfloat}, the first example above becomes: +% \begin{verbatim} +% \keyfig{w=3in,c=A Figure,l=fig:somelabel}{filename} +% \end{verbatim} +% \unskip +% +% The \cs{onefigure} example above becomes: +% \begin{verbatim} +% \keyfig*[loc]{w=width,t={add'l text},sc=shortcap,cstar=caption, +% l=label}{filename} +% \end{verbatim} +% +% \subsection{Features} +% +% The macros and environments provided by \pkg{keyfloat} include: +% \begin{description} +% \item[\cs{keyfig}:] A figure with an image. +% \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[\cs{keytab}:] A table. +% \item[keyfigure:] A figure environment. +% \item[keytable:] A table environment. +% \item[keyfloats:] A group of rows and columns of floats. +% \item[keysubfigs:] A figure containing a group of rows and columns of subfigures. +% \item[keysubtabs:] A table containing a group of rows and columns of subtables. +% \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 The number of columns is specified, and extra +% floats are placed onto additional rows. +% \item Floats may be placed [H]ere +% \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. +% \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 entires. +% +% 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{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{\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}. +% +% \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. +% +% \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}. +% +% \medskip\hrule +% The above macros and environments may be used by themselves, +% or inside the following \env{keyfloats}, \env{keysubfigs}, or +% \env{keysubtabs} environments. +% \medskip\hrule +% +% +% \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} \\ +% \DescribeEnv{keysubtabs} * \oarg{loc} \marg{numcols} \marg{keys} \\ +% A group of subfigures or subtables typeset in rows. +% May not be nested. +% See \cref{ex:keysubfigs}. +% +% \bigskip\hrule +% +% The star option create floats which span both columns in a two-column +% \DescribeArgument{*} +% document. +% +% The [H] location may be used to force a figure to be ``Here'', in the +% \DescribeArgument{{[H]}} +% form of a minipage instead of a float. A caption and label may +% still be assigned. +% +% The star and [loc] options are ignored for floats inside a \env{keyfloats}, +% \DescribeArgument{{[loc]}} +% \env{keysubfigs}, or \env{keysubtabs} environment. Note that these +% container environments may have their own star and [loc] options. +% +% +% +% +% +% +% \subsection{Keys and Values} +% +% +% \newcommand{\largebullet}{{\Large\textbullet}} +% +% \begin{keytable}[bp]{c={Keys and Values — Part I},l={tab:keyvals},stretch=1.5} +% \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 & \largebullet & Artist's prefix, such as ``Mr.''\tnote{b} & ap=Mr. \\ +% af & \largebullet & Artist's first name.\tnote{b} & af=First \\ +% al & \largebullet & Artist's last name.\tnote{b} & al=Last \\ +% as & \largebullet & Artist'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 keys: Only used in Figure floats. +% A fixed-width non-breakable space is placed between 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} +% \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 \\ +% \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} +% \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/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/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} +% +% +% +% +% +% \clearpage +% +% \subsection{Examples} +% +% +% \subsubsection{Single Floats} +% +% +% \begin{newexample}[\Cref{fig:simple}]{Figure with an image from a file} +% \keyfig{c=A \cs{keyfig} with an image,l=fig:simple}{image} +% \end{newexample} +% +% 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{newexample}[\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{newexample} +% +% 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{newexample}[\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{newexample} +% +% The \env{keyfigure} environment is preferred over the \cs{keyfigbox} macro when +% multiple lines of contents are to be included. +% +% \begin{newexample}[\Cref{tab:simpletable}]{Table macro} +% \keytab{c=A \cs{keytab} table,l=tab:simpletable}{\testtable} +% \end{newexample} +% +% 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{newexample}[\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. +% +% \testtable +% \end{keytable} +% \end{newexample} +% +% The \env{keytable} environment is preferred over the \cs{keytab} macro +% since most tables are multi-line creations. +% +% \clearpage +% +% \begin{newexample}[\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{newexample} +% +% 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{newexample}[\Cref{fig:linewidth}]{Using \cs{linewidth}} +% \keyfig{lw=.5,c=Half of \cs{linewidth},l=fig:linewidth}{image} +% \end{newexample} +% +% \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{newexample}[\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{newexample} +% +% 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{newexample}[\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{newexample} +% +% 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} +% +% \begin{newexample}[\Cref{fig:here}]{Located [H]ere} +% \keytab[H]{c={A table [H]},l=fig:here}{\testtable} +% \end{newexample} +% +% \Cref{fig:here} is 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. +% +% +% +% \begin{newexample}[See fig: ``A starred caption''.]{Unnumbered float} +% \keyfig[H]{f,cstar={A starred caption}}{image} +% \end{newexample} +% +% 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{newexample} +% [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{newexample} +% +% A starred caption with a non-empty short caption creates an +% unnumbered entry in the List of Figures. +% +% +% \begin{newexample} +% [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{newexample} +% +% By using [H] and |cstar={}|, the image is placed inline +% without a number or \acro{LOF} entry. +% +% Also see \cref{ex:keyparbox}. +% +% +% \begin{newexample}[\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 floatrow.} +% \end{newexample} +% +% 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{newexample}[\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{newexample} +% +% +% \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{newexample}[\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{newexample} +% +% \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|}| +% +% +% +% \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{newexample}[\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{newexample} +% +% +% \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{newexample}[\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{newexample} +% +% +% +% \clearpage +% \subsubsection{Custom Frames} +% +% +% \begin{newexample}[\Cref{fig:customframe,fig:customlooseframe}] +% {Custom frames with \pkg{mdframed}\label{ex:customframe}} +% \renewcommand{\KFLTtightframe}[1]{% +% \begin{mdtightframe}% +% #1 +% \end{mdtightframe}% +% } +% \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}{image} +% \keyfigbox{f,c=Custom loosely-framed box, +% l=fig:customlooseframe}{A loosely-framed box.} +% \end{newexample} +% +% \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. +% \index{troubleshooting>rotating>extra space} +% \index{troubleshooting>mdframed} +% +% See \cref{sec:customframes} for more details. +% +% \begin{newexample}[\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{newexample} +% +% \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{newexample}[\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{newexample} +% +% +% \begin{newexample}[\Cref{fig:artistpar}]{Artist's name — arbitary contents} +% \tdnameright +% \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} +% \tdnamecenter +% \end{newexample} +% +% 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. +% +% +% \clearpage +% +% \begin{newexample}[\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 large 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{newexample} +% +% 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 an associated \LaTeX\ length: \\ +% \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 defaults definitions are: +% \begin{Verbatim}[gobble=2] +% \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{Verbatim} +% +% 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 adjustments may be made. +% The values used in this documentation are: +% \begin{verbatim} +% \setlength{\floatsep}{5ex plus 1ex minus 1ex} +% \setlength{\dblfloatsep}{5ex plus 1ex minus 1ex} +% \end{verbatim} +% +% +% \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{verbatim} +% \captionsetup[figure]{ +% style=default, justification=centering, +% margin=0pt, parskip=0pt, skip=1ex, +% 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=1ex, +% labelfont={small},textfont={small} +% } +% +% \captionsetup[subtable]{ +% style=default, justification=centering, +% margin=0pt, parskip=0pt, skip=1ex, +% labelfont={small},textfont={small} +% } +% \end{verbatim} + + + +% \clearpage +% +% \StopEventually{\PrintChanges\PrintIndex} +% +% +% +% \section{Code} +% +% +% +% +% +% +% \subsection{Required Packages} +% +% \DescribePackage{etoolbox} v2.6 or later +% for \cs{BeforeBeginEnvironment}, \cs{AfterEndEnvironment} +% \begin{macrocode} +\RequirePackage{etoolbox}[2011/01/03]% + +\RequirePackage{xparse} + +\RequirePackage{xifthen} +% \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 then \env{turn} environment: +% \begin{macrocode} +\RequirePackage{rotating} +% \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{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{c} Caption +% +% \begin{macrocode} +\define@key{KFLT@keys}{c}% + {\renewcommand{\KFLT@c}{#1}\setboolean{KFLT@cstar}{false}} +% \end{macrocode} +% +% \DescribeKey{cstar} Caption starred? +% +% \begin{macrocode} +\define@key{KFLT@keys}{cstar}% + {\renewcommand{\KFLT@c}{#1}\setboolean{KFLT@cstar}{true}} +% \end{macrocode} +% +% \DescribeKey{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} +% +% \begin{macro}{\KFLT@listtype} List type: ``|lof|'', ``|lot|'' +% \begin{macrocode} +\newcommand*{\KFLT@listtype}{} +% \end{macrocode} +% \end{macro} +% +% +% \DescribeKey{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 \pkg{tocdata} package: +% +% \DescribeKey{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{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{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{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} +% +% +% +% +% +% +% \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 if \pkg{tocdata} is not loaded: +% \begin{macrocode} +\@ifpackageloaded{tocdata} +{} +{ +\newcommand{\tdtextjustify}{} +\newcommand{\tdtextcenter}{} +\newcommand{\tdtextleft}{} +\newcommand{\tdtextright}{} +\newcommand{\tdnamejustify}{} +\newcommand{\tdnamecenter}{} +\newcommand{\tdnameleft}{} +\newcommand{\tdnameright}{} +} +% \end{macrocode} +% +% \DescribeKey{t} Additional text, justified alignment. +% \begin{macrocode} +\define@key{KFLT@keys}{t}{ +\renewcommand{\KFLT@t}{#1} +\renewcommand{\KFLT@textalign}{} +\tdtextjustify +} +% \end{macrocode} +% +% \DescribeKey{tc} Additional text, centered alignment. +% \begin{macrocode} +\define@key{KFLT@keys}{tc}{ +\renewcommand{\KFLT@t}{#1} +\renewcommand{\KFLT@textalign}{\centering} +\tdtextcenter +} +% \end{macrocode} +% +% \DescribeKey{tr} Additional text, aligned to the right. +% \begin{macrocode} +\define@key{KFLT@keys}{tr}{ +\renewcommand{\KFLT@t}{#1} +\renewcommand{\KFLT@textalign}{\raggedleft} +\tdtextright +} +% \end{macrocode} +% +% \DescribeKey{tl} Additional text, aligned to the left. +% \begin{macrocode} +\define@key{KFLT@keys}{tl}{ +\renewcommand{\KFLT@t}{#1} +\renewcommand{\KFLT@textalign}{\raggedright} +\tdtextleft +} +% \end{macrocode} +% +% +% +% \begin{macro}{\KFLT@i} Image filename storage +% \begin{macrocode} +\newcommand*{\KFLT@i}{} +% \end{macrocode} +% \end{macro} +% +% +% \DescribeKey{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{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{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{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{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{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{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{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} + + + + +% \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{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{c} Caption +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{c} + {\renewcommand{\KFLT@subgrpc}{#1}\setboolean{KFLT@subgrpcstar}{false}} +% \end{macrocode} +% +% \DescribeKey{cstar} Starred caption? +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{cstar} + {\renewcommand{\KFLT@subgrpc}{#1}\setboolean{KFLT@subgrpcstar}{true}} +% \end{macrocode} +% +% \DescribeKey{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} + +% \begin{macro}{\KFLT@subgrptype} Subfloats collection list type storage: +% ``|lof|'', ``|lot|'' +% \begin{macrocode} +\newcommand*{\KFLT@subgrplisttype}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\KFLT@setsubgrpfigure} Set to figure type +% \begin{macrocode} +\newcommand*{\KFLT@setsubgrpfigure}{% +\renewcommand{\KFLT@subgrptype}{figure}% +\renewcommand{\KFLT@subgrplisttype}{lof}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\KFLT@setsubgrptable} Set to table type +% \begin{macrocode} +\newcommand*{\KFLT@setsubgrptable}{% +\renewcommand{\KFLT@subgrptype}{table}% +\renewcommand{\KFLT@subgrplisttype}{lot}% +} +% \end{macrocode} +% \end{macro} +% +% +% \DescribeKey{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{t} Additional text — full justification +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{t}{ +\renewcommand{\KFLT@subgrpt}{#1} +\renewcommand{\KFLT@subgrptextalign}{} +\tdtextjustify +} +% \end{macrocode} +% +% \DescribeKey{t} Additional text — center justification +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{tc}{ +\renewcommand{\KFLT@subgrpt}{#1} +\renewcommand{\KFLT@subgrptextalign}{\centering} +\tdtextcenter +} +% \end{macrocode} +% +% \DescribeKey{t} Additional text — aligned left +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{tl}{ +\renewcommand{\KFLT@subgrpt}{#1} +\renewcommand{\KFLT@subgrptextalign}{\raggedright} +\tdtextleft +} +% \end{macrocode} +% +% \DescribeKey{t} Additional text — aligned right +% \begin{macrocode} +\define@key{KFLT@subgrpkeys}{tr}{ +\renewcommand{\KFLT@subgrpt}{#1} +\renewcommand{\KFLT@subgrptextalign}{\raggedleft} +\tdtextright +} +% \end{macrocode} +% +% +% +% For the \pkg{tocdata} package: +% +% \DescribeKey{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{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{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{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} +%% +% +% +% +% +% +% +% +% + + +% \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} +\ifthenelse{\boolean{KFLT@ft}}% tight frame? +{\setlength{\KFLT@boxwidth}{\linewidth - 2\KFLTtightframewidth}}% +{% not tight frame +\ifthenelse{\boolean{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} +\ifthenelse{\dimtest{\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 redefine to the total width of the new +% frame and its separation. +% +% \begin{macro}{\KFLT@tightframe} \marg{contents} +% \begin{macrocode} +\newcommand{\KFLTtightframe}[1]{% +\setlength{\fboxsep}{0pt}% +\setlength{\fboxrule}{.4pt}% +\fbox{#1}% +} + +% \end{macrocode} +% \end{macro} +% +% \DescribeLength{\KFLTtightframewidth} Combined width of the frame and separation. +% \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} Combined width of the frame and separation. +% \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] +{% +\ifthenelse{\boolean{KFLT@ft}}% +{\KFLTtightframe{#1}}% +{% not tightframe +\ifthenelse{\boolean{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{\KFLT@envboxwidth}{\usebox{\KFLT@envbox}}% +\ifthenelse{\boolean{KFLT@ft}}% +{\addtolength{\KFLT@envboxwidth}{2\KFLTtightframewidth}}% +{% not tightframe +\ifthenelse{\boolean{KFLT@f}}% +{\addtolength{\KFLT@envboxwidth}{2\KFLTlooseframewidth}}% +{}% no frame +}% not looseframe +} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \subsection{A Graphics Image from a File} +% +% \begin{macro}{\KFLT@onefigureimage} Create a stand-alone figure with an image. +% \begin{macrocode} +\NewDocumentCommand{\KFLT@onefigureimage}{} +{% +% \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} +\ifthenelse{\NOT\equal{\KFLT@lw}{}}% +{\includegraphics% +[scale=\KFLT@s,width=\KFLT@imagewidth]{\KFLT@i}}% +{% not linewidth +% \end{macrocode} +% Handle the |w| key, which may be used along with the |h| key: +% \begin{macrocode} +\ifthenelse{\dimtest{\KFLT@w}{>}{0pt}}% +{% width is given +\ifthenelse{\dimtest{\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]{\KFLT@i}% +}% w and h +% \end{macrocode} +% Only width: +% \begin{macrocode} +{% only w +\includegraphics% +[scale=\KFLT@s,width=\KFLT@imagewidth]{\KFLT@i}% +}% only w +}% width is given +% \end{macrocode} +% Width was not given, so maybe handle |h| alone: +% \begin{macrocode} +{% width is not given +\ifthenelse{\dimtest{\KFLT@h}{>}{0pt}}% +% \end{macrocode} +% |h| was given: +% \begin{macrocode} +{\includegraphics% +[scale=\KFLT@s,height=\KFLT@h]{\KFLT@i}}% +% \end{macrocode} +% If none were given, use the image's natural size: +% \begin{macrocode} +{\includegraphics% +[scale=\KFLT@s]{\KFLT@i}}% +}% width is not given +}% not linewidth +\end{lrbox}% +\unskip% +\KFLT@findenvboxwidth% +\begin{turn}{\KFLT@r}% +% \end{macrocode} +% Encapsulate the frame in case the +% custom frame commands used pars: +% \begin{macrocode} +\begin{minipage}{\KFLT@envboxwidth}% +\KFLT@frame{\usebox{\KFLT@envbox}}% +\end{minipage}% +\unskip% +\end{turn}% +\par% +\addvspace{2ex}% +} +% \end{macrocode} +% \end{macro} + + + + +% \subsection{Printing the Caption} +% +% +% \begin{macro}{\KFLT@captioniftype} \marg{|figure| or |table|} \marg{\mainsubarg} +% +% Create a caption only if is of this float type. +% +% The second argument is |{}| if a regular float, or +% |subgrp| if \cs{keysubfigs} or \cs{keysubtabs}. +% \begin{macrocode} +\newcommand*{\KFLT@captioniftype}[2]{% +\ifthenelse{\equal{\csname KFLT@#2type\endcsname}{#1}}% +{\KFLT@caption{#2}}% +{}% +} +% \end{macrocode} +% \end{macro} + + + + +% \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? +{% star +\IfValueTF{#2}{\caption*[#2]{#3}}{\caption*{#3}}% +}% star +{% no star +\IfValueTF{#2}{\caption[#2]{#3}}{\caption{#3}}% +}% no star +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\KFLT@docaption} * \oarg{short caption} \marg{caption} \marg{\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|. +% \begin{macrocode} +% \end{macrocode} +% There are two versions, depending on whether \pkg{tocdata} is loaded. +% \begin{macrocode} +\@ifpackageloaded{tocdata} +{% tocdata loaded +% \end{macrocode} +% \pkg{tocdata} is loaded: +% \begin{macrocode} +\NewDocumentCommand{\KFLT@docaption}{s o m m} +{% +% \end{macrocode} +% Is this a figure? +% \begin{macrocode} +\ifthenelse{\equal{\csname KFLT@#4type\endcsname}{figure}}% +{% figure +% \end{macrocode} +% Is the last name empty? Assume no artist if so. +% \begin{macrocode} +\ifcsempty{KFLT@#4al}% +{% figure w/o artist +% \end{macrocode} +% A figure without an artist uses the simple caption. +% \begin{macrocode} +\KFLT@dosimplecaption{#1}{#2}{#3}% +}% 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} +\IfBooleanTF{#1}{% star +\captionartist*[#2]{#3}% +[\csname KFLT@#4t\endcsname]% +[\csname KFLT@#4ap\endcsname]% +{\csname KFLT@#4af\endcsname}% +{\csname KFLT@#4al\endcsname}% +[\csname KFLT@#4as\endcsname]% +}% star +{% no star +\captionartist[#2]{#3}% +[\csname KFLT@#4t\endcsname]% +[\csname KFLT@#4ap\endcsname]% +{\csname KFLT@#4af\endcsname}% +{\csname KFLT@#4al\endcsname}% +[\csname KFLT@#4as\endcsname]% +}% no star +}% figure with an artist +}% figure +{% not a figure, ignore artist information: +% \end{macrocode} +% If it isn't a figure, ignore artist information and create a simple caption: +% \begin{macrocode} +\KFLT@dosimplecaption{#1}{#2}{#3}% +}% not a figure +}% KFLT@tocdata +}% tocdata loaded +{% no tocdata +\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 first name: +% \begin{macrocode} +\ifcsempty{KFLT@#4af}% +{\index{\csname KFLT@#4al\endcsname}}% +{\index{\csname KFLT@#4al\endcsname, \csname KFLT@#4af\endcsname}}% +}% 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} +\ifthenelse{\boolean{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: +% \begin{macrocode} +{% non-empty cstar and sc: +\addcontentsline{\KFLT@listtype}% +{\csname KFLT@#1type\endcsname}{\KFLT@sc}% +}% non-empty cstar and sc +% \end{macrocode} +% |cstar| was given, so create an unnumbered caption: +% \begin{macrocode} +\KFLT@docaption*{\csname KFLT@#1c\endcsname}{#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{\csname KFLT@#1c\endcsname}{#1}% +}% no short cap +{% short cap +\KFLT@docaption[\csname KFLT@#1sc\endcsname]% +{\csname KFLT@#1c\endcsname}{#1}% +}% short cap +% \end{macrocode} +% Optional label: +% \begin{macrocode} +\ifcsempty{KFLT@#1l}% +{}% +{\label{\csname KFLT@#1l\endcsname}}% +}% 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@listtype}{lof}% +\renewcommand{\KFLT@l}{}% +\renewcommand{\KFLT@ap}{}% +\renewcommand{\KFLT@af}{}% +\renewcommand{\KFLT@al}{}% +\renewcommand{\KFLT@as}{}% +\renewcommand{\KFLT@t}{}% +\renewcommand{\KFLT@textalign}{}% +\tdtextjustify% +\renewcommand{\KFLT@i}{}% +\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}% +} +% \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}{% +\ifthenelse{\cnttest{\value{KFLT@thiscol}}{>=}{\value{KFLT@numcols}}}% +{% + +\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} +\ifthenelse{% +\cnttest{\value{KFLT@keyfloatdepth}}>{0}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +{% nested +% \end{macrocode} +% Tracks row start and end: +% \begin{macrocode} +\KFLT@maybestartfloatrow% +% \end{macrocode} +% Possibly fill space between columns: +% \begin{macrocode} +\ifthenelse{\cnttest{\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{2ex}% +\begin{minipage}{\linewidth}% +% \end{macrocode} +% Set the alignment and some text parameters: +% \begin{macrocode} +\csname KFLT@#1textalign\endcsname% +\footnotesize% +\setlength{\parskip}{1.5ex}% +\setlength{\parindent}{0em}% +% \end{macrocode} +% Typeset the actual text: +% \begin{macrocode} +\csname KFLT@#1t\endcsname% +% \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] +{% +\ifthenelse{\equal{#1}{}}% +{}% +{#1~}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\KFLT@addartisttext} \marg{\mainsubarg} +% +% Adds optional artist's name and add'l 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, this float is a figure, and artist information +% is given, then the float's artist's information and optional text will be printed +% elsewhere by \cs{KFLT@caption}. Otherwise, it is printed here along with the text. +% \begin{macrocode} +% \end{macrocode} +% 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 use the artist name if this is a figure: +% \begin{macrocode} +\ifthenelse{\equal{\csname KFLT@#1type\endcsname}{figure}}% +{% figure +% \end{macrocode} +% Only use the artist name if a last name is given: +% \begin{macrocode} +\ifcsempty{KFLT@#1al}% +% \end{macrocode} +% A figure but no artist: +% \begin{macrocode} +{\KFLT@addtext{#1}}% +% \end{macrocode} +% A figure with an artist: will be handled by \pkg{tocdata} when the caption is created. +% \begin{macrocode} +{}% fig w/ artist: text will be added by \captionartist in \KFLT@caption +}% figure +% \end{macrocode} +% If not a figure, ignore artist information: +% \begin{macrocode} +{\KFLT@addtext{#1}}% +}% KFLT@addartisttext +}% tocdata loaded +% \end{macrocode} +% If \pkg{tocdata} is not loaded: +% \begin{macrocode} +{% tocdata not loaded +\newcommand{\KFLT@addartisttext}[1] +{% +% \end{macrocode} +% Only use the artist information if a last name is given: +% \begin{macrocode} +\ifcsempty{KFLT@#1al}% +{}% last name not given +{% last name given +% \end{macrocode} +% Add space and create the name inside a full-width minipage: +% \begin{macrocode} +\addvspace{2ex}% +\begin{minipage}{\linewidth}% +% \end{macrocode} +% If \pkg{tocdata} is not used, the artist's name is always centered: +% \begin{macrocode} +\centering\footnotesize\textsc{% +\KFLT@optionalname{\csname KFLT@#1ap\endcsname}% +\KFLT@optionalname{\csname KFLT@#1af\endcsname}% +\csname KFLT@#1al\endcsname\csname KFLT@#1as\endcsname% +}% +\end{minipage}% +\par\addvspace{2ex}% +}% last name given +% \end{macrocode} +% Any additional text follows the artist's name: +% \begin{macrocode} +\KFLT@addtext{#1}% +}% KFLT@addartisttext +}% tocdata not loaded +% \end{macrocode} +% \end{macro} + + +% \begin{environment}{KFLT@boxinner} +% +% Typeset the contents in a width which depends on the keys. +% \begin{macrocode} +\newsavebox{\KFLT@envbox} +\newlength{\KFLT@envboxwidth} + +\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\addvspace{\medskipamount}% +}% endkeyboxinner +% \end{macrocode} +% \end{environment} + + +% \begin{macro}{\KFLT@boxkeys} \marg{keys} \marg{|figure|/|table|} \marg{|lof|/|lot|} +% +% Default the options, adjust for a table, then parse the keys: +% \begin{macrocode} +\NewDocumentCommand{\KFLT@boxkeys}{+m m m} +{% +\KFLT@defaults% +\renewcommand{\KFLT@type}{#2}% +\renewcommand{\KFLT@listtype}{#3}% +\setkeys{KFLT@keys}{#1}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{environment}{KFLT@boxouter} +% \marg{star?} \marg{loc} +% +% Boxes the contents of figures and floats. +% +% Not used by subfigures. +% \begin{macrocode} +\NewDocumentEnvironment{KFLT@boxouter}{m m} +{% keyboxouter +% \end{macrocode} +% The \env{keytable} environment boxes the contents inside an optional frame of hrules, +% then handles them in either of +% three possible ways, depending on whether it is +% called alone, inside a \env{keyfloats} environment, or +% inside a \env{keysubtabs} environment. +% +% Start the new subfigure or subtable, of the given width: +% \begin{macrocode} +\ifthenelse{\boolean{KFLT@inkeysubfloats}}% +{\csname sub\KFLT@type\endcsname{\KFLT@rowboxwidth}}% subfloat +% \end{macrocode} +% If \env{keyfloats}, place the contents inside a \env{minipage}: +% \begin{macrocode} +{% not subfloat: +\ifthenelse{\cnttest{\value{KFLT@keyfloatdepth}}>{0}}% +{% keyfloats +\minipage{\KFLT@rowboxwidth}% +\captionsetup{type=\KFLT@type}% +}% keyfloats +{% not keyfloats +% \end{macrocode} +% +% Not a subfloat or \env{keyfloats}, so create a single float. +% +% See if the float should be positioned [H]ere: +% \begin{macrocode} +\ifthenelse{\equal{#2}{H}}% +% \end{macrocode} +% Place [H], so create an inline minipage: +% \begin{macrocode} +{% [H] +\noindent\minipage{\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}% +{\csname \KFLT@type*\endcsname[#2]}{\csname \KFLT@type\endcsname[#2]}% +}% not [H] +}% not keyfloats +}% not subfloat +% \end{macrocode} +% Handle a continued float. Ignored if in a subfloat. +% \begin{macrocode} +\ifthenelse{\boolean{KFLT@cont}}{\ContinuedFloat}{}% +% \end{macrocode} +% Figure out image and parbox widths for the contents: +% \begin{macrocode} +\KFLT@findwidths% +% \end{macrocode} +% If a table, place the caption above the contents: +% \begin{macrocode} +\KFLT@captioniftype{table}{}% +% \end{macrocode} +% Typeset the contents: +% \begin{macrocode} +\begin{center}% +\unskip% +\minipage{\linewidth}% +\centering% +}% keyboxouter +% \end{macrocode} +% +% End of the keyboxouter environment: +% +% \begin{macrocode} +{% endboxouter +\endminipage% +\end{center}% +\unskip\addvspace{\medskipamount}% +% \end{macrocode} +% Optionally print artist's name and additional text: +% \begin{macrocode} +\KFLT@addartisttext{}% +% \end{macrocode} +% If a figure, typeset the caption below the contents: +% \begin{macrocode} +\KFLT@captioniftype{figure}{}% +% \end{macrocode} +% If are inside \env{keysubtabs}, end the subtable: +% \begin{macrocode} +\ifthenelse{\boolean{KFLT@inkeysubfloats}}% +{\csname endsub\KFLT@type\endcsname}% subfloat +{% not subfloat +\ifthenelse{\cnttest{\value{KFLT@keyfloatdepth}}>{0}}% keyfloat? +{\endminipage}% keyfloats +{% not keyfloats +% \end{macrocode} +% +% Not subfloat or \env{keyfloats}, so is an individual float. +% +% Close the minipage or float: +% \begin{macrocode} +\ifthenelse{\equal{#2}{H}}% +{% +\endminipage% [H] +}% +{% not [H] +\IfBooleanTF{#1}% starred table? +{\csname end\KFLT@type*\endcsname}{\csname end\KFLT@type\endcsname}% +}% not [H] +}% not keyfloats +}% not subfloat +}% endkeyboxouter +% \end{macrocode} +% \end{environment} + + + +% \subsection{The \env{keyfigure} Environment} + +% \begin{environment}{keyfigure} * \oarg{loc} \marg{\keyvalsarg} +% \begin{macrocode} +\NewDocumentEnvironment{keyfigure}{s O{tbp} +m} +{% +\KFLT@boxkeys{#3}{figure}{lof}% +\KFLT@boxouter{#1}{#2}% +\KFLT@boxinner% +}% +{% +\endKFLT@boxinner% +\endKFLT@boxouter% +} +% \end{macrocode} +% \end{environment} + +% Extra code to track rows outside of the \env{keyfigure} environment, +% \DescribeSimple{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{loc} \marg{\keyvalsarg} \marg{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. +% \begin{macrocode} +\NewDocumentCommand{\keyfig}{s O{tbp} +m m} +{% +\KFLT@trackrows% +\KFLT@boxkeys{#3}{figure}{lof}% +% \end{macrocode} +% After setting default values, overridge with the filename: +% \begin{macrocode} +\renewcommand{\KFLT@i}{#4}% +\KFLT@boxouter{#1}{#2}% +\KFLT@onefigureimage% +\endKFLT@boxouter% +} +% \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. +% \begin{macrocode} +\NewDocumentCommand{\keyfigbox}{s O{tbp} +m +m} +{% +\KFLT@trackrows% +\KFLT@boxkeys{#3}{figure}{lof}% +\KFLT@boxouter{#1}{#2}% +\KFLT@boxinner% +#4% +\endKFLT@boxinner% +\endKFLT@boxouter% +} +% \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. +% \begin{macrocode} +\NewDocumentCommand{\keyparbox}{s O{tbp} +m +m} +{% +\KFLT@trackrows% +\KFLT@boxkeys{#3}{figure}{lof}% +% \end{macrocode} +% Force |cstar={}|: +% \begin{macrocode} +\renewcommand{\KFLT@c}{}% +\setboolean{KFLT@cstar}{true}% +% \end{macrocode} +% Continue like \cs{figbox}: +% \begin{macrocode} +\KFLT@boxouter{#1}{#2}% +\KFLT@boxinner% +#4% +\endKFLT@boxinner% +\endKFLT@boxouter% +} +% \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. +% \begin{macrocode}+ +\NewDocumentCommand{\keytab}{s O{tbp} +m +m} +{% +\KFLT@trackrows% +\KFLT@boxkeys{#3}{table}{lot}% +\KFLT@boxouter{#1}{#2}% +\KFLT@boxinner% +\centering% +#4% +\endKFLT@boxinner% +\endKFLT@boxouter% +} +% \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@boxkeys{#3}{table}{lot}% +\KFLT@boxouter{#1}{#2}% +\KFLT@boxinner% +\centering% +}% +{% +\endKFLT@boxinner% +\endKFLT@boxouter% +} +% \end{macrocode} +% \end{environment} + +% Extra code to track rows outside of the \env{keytable} environment, +% \DescribeSimple{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}{% +\ifthenelse{% +\cnttest{\value{KFLT@keyfloatdepth}}>{0}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +{% +\PackageError{keyfloat}{Cannot nest keysubfigs or keysubtabs.% +(Not in outer par mode.)}% +{The subcaption package do not support nested environments, so% +the keyfloat package cannot place a keysubfigs or keysubtabs% +environment inside another, or inside a keyfloats.}% +}% +{}% +} +% \end{macrocode} +% \end{macro} + +% \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. +% +% \begin{macrocode} +\NewDocumentEnvironment{keyfloats}{s O{tbp} m} +{% +% \end{macrocode} +% Nest the environment: +% \begin{macrocode} +\addtocounter{KFLT@keyfloatdepth}{1}% +% \end{macrocode} +% If [H] or nested, use a minipage instead of a float: +% \begin{macrocode} +\ifthenelse{% +\equal{#2}{H}% +\OR\cnttest{\value{KFLT@keyfloatdepth}}>{1}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +% \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} +\ifthenelse{% +\cnttest{\value{KFLT@keyfloatdepth}}>{1}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +{\noindent% +\begin{minipage}{\KFLT@rowboxwidth}}% +{\bigbreak% +\noindent\begin{minipage}{\linewidth}}% +% \end{macrocode} +% If inside subfloats, generate subfigures by default: +% \begin{macrocode} +\ifthenelse{\boolean{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} +\ifthenelse{% +\cnttest{\value{KFLT@keyfloatdepth}}>{1}% +\OR\boolean{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} +\ifthenelse{% +\equal{#2}{H}% +\OR\cnttest{\value{KFLT@keyfloatdepth}}>{1}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +{\end{minipage}% +% \end{macrocode} +% Spacing if nested: +% \begin{macrocode} +\ifthenelse{\cnttest{\value{KFLT@keyfloatdepth}}>{0}}% +{}{\bigbreak}% +}% was [H] +% \end{macrocode} +% Was not [H], so close a figure: +% \begin{macrocode} +{% not [H] +\IfBooleanTF{#1}% starred figure? +{\end{figure*}}{\end{figure}}% +}% not [H] +% \end{macrocode} +% Unnest the environment: +% \begin{macrocode} +\addtocounter{KFLT@keyfloatdepth}{-1}% +} +% \end{macrocode} +% \end{environment} + + + +% Extra code to track rows outside of the \env{keyfloats} environment, +% \DescribeSimple{Before \env{keyfloats}} +% before it starts. This is done to allow nesting without losing track +% of the prior level. +% +% \begin{macrocode} +\BeforeBeginEnvironment{keyfloats}{% +% \end{macrocode} +% Track rows: +% \begin{macrocode} +\ifthenelse{% +\cnttest{\value{KFLT@keyfloatdepth}}>{0}% +\OR\boolean{KFLT@inkeysubfloats}% +}% +{\KFLT@maybestartfloatrow}{}% +% \end{macrocode} +% Possibly fill space between columns: +% \begin{macrocode} +\ifthenelse{\cnttest{\value{KFLT@thiscol}}{>}{1}}% +{\hfill}{}% +} +% \end{macrocode} + + +% \subsection{Subfigures} + +% \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@subgrplisttype}{lof}% +\renewcommand{\KFLT@subgrpl}{}% +\renewcommand{\KFLT@subgrpap}{}% +\renewcommand{\KFLT@subgrpaf}{}% +\renewcommand{\KFLT@subgrpal}{}% +\renewcommand{\KFLT@subgrpas}{}% +\renewcommand{\KFLT@subgrpt}{}% +\renewcommand{\KFLT@subgrptextalign}{} +\tdtextjustify +} +% \end{macrocode} +% \end{macro} + + + + + + +% \begin{macro}{\KFLT@subfloats} \marg{starred?} \marg{loc} \marg{cols} \marg{\keyvalsarg} +% +% Start a subfloat environment +% \begin{macrocode} +\NewDocumentCommand{\KFLT@subfloats}{m m m +m} +{% +% \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], create an inline minipage: +% \begin{macrocode} +\ifthenelse{\equal{#2}{H}}% +{% +\bigbreak\noindent\begin{minipage}{\linewidth}% +}% +% \end{macrocode} +% Isn't [H], so create a float, possibly starred: +% \begin{macrocode} +{% +\IfBooleanTF{#1}% +{\begin{\KFLT@type*}[#2]}{\begin{\KFLT@type}[#2]}% +}% +% \end{macrocode} +% Set the caption type: +% \begin{macrocode} +\captionsetup{type=\KFLT@subgrptype}% +% \end{macrocode} +% Process continued floats: +% \begin{macrocode} +\ifthenelse{\boolean{KFLT@subgrpcont}}{\ContinuedFloat}{}% +% \end{macrocode} +% Center the contents: +% \begin{macrocode} +\centering% +% \end{macrocode} +% If this is a table, place the caption above the contents: +% \begin{macrocode} +\KFLT@captioniftype{table}{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{tdtextcenter}, 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% +% \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} +% If this was a figure, place the caption below the contents: +% \begin{macrocode} +\KFLT@captioniftype{figure}{subgrp}% +% \end{macrocode} +% End the float or minipage: +% \begin{macrocode} +\ifthenelse{\equal{#2}{H}}% +{\end{minipage}\bigbreak}% was [H] +{% not [H]: +\IfBooleanTF{#1}% starred? +{\end{\KFLT@type*}}{\end{\KFLT@type}}% +}% not [H] +% \end{macrocode} +% Unnest the environment: +% \begin{macrocode} +\setboolean{KFLT@inkeysubfloats}{false}% +} +% \end{macrocode} +% \end{macro} + + +% \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} +{% +% \end{macrocode} +% Error if trying to nest environments: +% \begin{macrocode} +\KFLT@nonest% +% \end{macrocode} +% Default the options: +% \begin{macrocode} +\KFLT@subgrpdefaults% +% \end{macrocode} +% Start of the environment: +% \begin{macrocode} +\KFLT@subfloats{#1}{#2}{#3}{#4}% +}% the start of the environment +% \end{macrocode} +% end of the environment: +% \begin{macrocode} +{% +\KFLT@endsubfloats{#1}{#2}% +} +% \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} +{% +% \end{macrocode} +% Error if trying to nest environments: +% \begin{macrocode} +\KFLT@nonest% +% \end{macrocode} +% Default the options: +% \begin{macrocode} +\KFLT@subgrpdefaults% +% \end{macrocode} +% Default to table float type: +% \begin{macrocode} +\KFLT@setsubgrptable% +% \end{macrocode} +% Start of the environment: +% \begin{macrocode} +\KFLT@subfloats{#1}{#2}{#3}{#4}% +}% the start of the environment +% \end{macrocode} +% End of the environment: +% \begin{macrocode} +{% +\KFLT@endsubfloats{#1}{#2}% +} +% \end{macrocode} +% \end{environment} + + + + +% +% +% \iffalse +% +% \fi + + + + +% \clearpage +% \pagestyle{plain} +% +% \renewcommand{\partname}{} +% \renewcommand{\thepart}{} +% \part{Change History and Index} +% +% \Finale + +\endinput diff --git a/Master/texmf-dist/source/latex/keyfloat/keyfloat.ins b/Master/texmf-dist/source/latex/keyfloat/keyfloat.ins new file mode 100644 index 00000000000..6bea4e20794 --- /dev/null +++ b/Master/texmf-dist/source/latex/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 -- cgit v1.2.3