% \iffalse meta-comment
%<=*COPYRIGHT>
%% Copyright (C) 2011-2022 by Martin Scharrer <martin.scharrer@web.de>
%% -------------------------------------------------------------------
%% 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 Martin Scharrer.
%%
%% This work consists of the files adjustbox.dtx, adjustbox.ins
%% and the derived file adjustbox.sty.
%%
%<=/COPYRIGHT>
% \fi
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ^^A DRIVER (((
% \iffalse
%<*driver>
\ProvidesFile{adjustbox.dtx}[%
%<=*DATE>
    2022/10/17
%<=/DATE>
%<=*VERSION>
    v1.3a
%<=/VERSION>
    DTX file for the adjustbox package]
\documentclass[a4paper]{ydoc}[2011/08/11]
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{fourier}
\usepackage{newverbs}
\usepackage{xparse}
\MakeSpecialShortVerb\qverb\"
%\AtBeginDocument{\MakeShortMacroArgs\`\relax}
%\AtEndDocument{\DeleteShortVerb\`}
\GetFileInfo{adjustbox.dtx}
\usepackage{adjustbox}[\filedate]
\usepackage{tikz}

\renewenvironment{example}[1][Example:]{%
    \subsubsection*{#1}%
}{%
    \par
}
\newenvironment{examples}[1][Examples:]{%
    \subsubsection*{#1}%
}{%
    \par
}
\global\optionaloff
\let\optionalon\relax

\lstdefinelanguage{none}{}%
\lstdefinelanguage{adjustbox}{%
  moretexcs={%
      begin,end,adjustbox
  },
  emph={%
      frame,fbox,cframe,cfbox,minipage,raise
  },
}%

\lstdefinestyle{examplecode}{%
    basicstyle=\ttfamily\small,
    numbers=none,language=none,
    classoffset=1,
    morekeywords={begin,end},
    keywordstyle=\bfseries,
    classoffset=0,
    morekeywords={adjustbox,minsizebox,maxsizebox,lapbox,marginbox,phantombox},
    keywordstyle=\macrodescstyle,
    emph={viewport, trim, Trim, Viewport, Clip, Clip*, frame, fbox, cframe, cfbox, reflect, lap, margin, margin*, dpi,
    pxdim, execute, raise, valign, bgcolor, set, height, depth, vsize, width, totalheight, center, left, right, outer, inner, min, max,
    size, totalsize,
    minipage, varwidth, innerenv, innercode, env, Addcode, addcode, precode, Precode, appcode, angle, scale, height, width, totalheight, resolution,
    },
    emphstyle=\keydescstyle,
}

\makeatletter
\def\PrintExample{%
  \begingroup
  \par\smallskip\noindent
  \leavevmode
  \BoxExample
  \@tempdima=\textwidth
  \advance\@tempdima by -\wd\examplecodebox\relax
  \advance\@tempdima by -\wd\exampleresultbox\relax
  \advance\@tempdima by -15pt\relax
  \ifdim\@tempdima>\bigskipamount
    \hbox to \textwidth{%
     \null\hss
     \minipage[c]{\wd\examplecodebox}\usebox\examplecodebox\endminipage
     \hfill\hskip\bigskipamount\hfill
     \minipage[c]{\wd\exampleresultbox}%
        \EXAMPLERESULT
     \endminipage
     \hss\null
     }%
  \else
    \vbox{%
        \leftline{\usebox\examplecodebox}%
        \vspace{\bigskipamount}%
        \rightline{\EXAMPLERESULT}%
    }%
  \fi
  \par\smallskip
  \endgroup
}
\def\EXAMPLERESULT{%
    \leavevmode\hbox{%
    \textcolor{exampleborder}{%
        \boxframe
            {\dimexpr\wd\exampleresultbox+2\fboxrule\relax}%
            {\dimexpr\ht\exampleresultbox+\fboxrule\relax}%
            {\dimexpr\dp\exampleresultbox+\fboxrule\relax}%
        \hskip-\wd\exampleresultbox
        \hskip-\fboxrule
    }%
    \usebox\exampleresultbox
    }%
}%
\makeatother
\colorlet{exampleborder}{black!33}
\def\Descsep{\par\vskip-2.5ex\relax}

%\EnableCrossrefs
%\CodelineIndex
%\RecordChanges
\OnlyDescription
\renewcommand{\bottomfraction}{0.5}
\begin{document}
 \DocInput{adjustbox.dtx}
  \PrintChanges
  %\newpage\PrintIndex
\end{document}
%</driver>
% \fi
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ^^A Title page (((
% \CheckSum{3488}
%
% \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.1}{2011/01/24}{First internal version}
% \changes{v0.2}{2011/01/27}{First released version}
% \changes{v0.3}{2011/03/20}{Bug fix for wrong baseline placed on the bottom}
% \changes{v0.4}{2011/07/xx}{Added pdftex driver}
% \changes{v0.5}{2011/08/13}{Added more macros and keys}
% \changes{v0.5a}{2011/08/21}{Fixed \Key{left} and \Key{right} keys. Fixed \Key{valign}'='t}
% \changes{v0.6}{2011/09/04}{Added tabular support.}
% \changes{v0.6a}{2011/10/29}{Fixed issue with keys affecting the content in an unwanted way.}
% \changes{v0.7}{2011/10/30}{Added \cs{adjustboxset} and \cs{adjustimage} macros.}
% \changes{v0.8}{2011/11/14}{
%     Added driver files for dvips and xelatex. Moved pdftex driver code to own file.
%     Fixed and improved default unit code for the \opt{calc} option.
%     Changed \cs{adjustimage} code to use internals of \cs{includegraphics}. This allows the redefinition of \cs{includegraphics}.
%     Added manual for \Key{bgcolor} and added \Key{bgcolor*}.
%     Changed \Key{bgimage} to use \cs{adjustimage}.
%     Added manual entries for \Key{cfbox} and \Key{cframe}.
%     Removed loading of non-mandatory \pkg{storebox} package for now.
%     Added \Key{set vsize}.
%     Added shortcuts \Key{rlap} and \Key{llap}.
%     Added \adjincludegraphics and the Export option.
%     Fix for \Key{innerenv} argument.
%     Added lengths \cs{Width}, \cs{Height}, \cs{Depth} and \cs{Totalheight} for the original dimensions of the content.
%     Added own \cs{raisebox} variant to support math expressions even for \cs{includegraphics}.
%     Some code cleanup.
%     Added \Key{varwidth} key as an alternative to \Key{minipage}.
%     Added \stackbox and \Key{stack} key and \env{stackbox} environment (similar to \cs{shortstack})
%     Added check for \pkg{xcolor} package.
% }
% \changes{v0.9}{2012/05/16}{
%   Basic trim and clip macros and driver files are now placed in a dedicated minimal package 'trimclip'.
%   Special thanks goes to Joseph Wright (LaTeX3 project) for his work on the driver files.
%   Clipping drivers are provided for 'pdftex' (incl. LuaTeX), 'dvips' and 'xetex' as well as a PGF fall-back
%   driver.
%   Packages: New dedicated 'trimclip' package with own manual.
%       Better separation between 'adjcalc' and 'adjustbox' package.
%       Review of manuals
%   New adjustbox keys:
%       * content
%       * gstore
%       * gstore*
%       * gstore width/height/depth/totalheight/sizes
%       * gobble/discard
%       * phantom
%       * warn width
%       * float
%       * nofloat
%       * figure
%       * label
%       * caption
%       * vspace
%       * vspace*
%       * padding  (alias of 'margin')
%       * padding* (alias of 'margin*')
%   Fixes: env key now works correctly; Fixed raise box code.
%   Macro changes: Added third optional argument to \stackbox.
% }
% \changes{v1.0}{2012/05/21}{%^^A
%       * Updated manual to contain all new keys and macro.
%       * Code optimisations.
%       * Improvements of (re-)boxing code.
%       * Added user-level macros to define keys.
%       * Changed horizontal alignment keys to box the content and added matching macros.
%       * Changed horizontal inner/outer side keys to use 'ifodd' package and added matching macros.
%       * Added missing \cs{leavevmode} for "raise" key.
%       * Simplified code for "valign" key. Fixed spurious space for "valign=v".
%       * Fixed min/max size keys to double a single value correctly.
%       * Code cleanup with "warn width" key.
% }
% \changes{v1.1}{2018/04/08}{%^^A
%       * Several bug fixes.
%       * Support for round corners and frames.
% }
% \changes{v1.2}{2019/01/04}{%^^A
%       * Added missing 'clip' feature for rounded frames.
%       * Changed order of corner values for rounded frames. This includes an update to the clipping drivers.
%       * Corrected 'adjnofloat' environment used by the 'nofloat' key to support the 'hypcap' feature of the 'caption' and 'hypcap' packages.
%       * Updated manual description of `export` option as requested by Issue #9.
%       * Updated manual to use (left, bottom, right, top) for the side values instead of (llx, lly, urx, ury).
%       * Some other improvements in the manual.
%       * Added keys and matching commands and environments to align to the page margins and text area borders:
%         'pagecenter', 'pageleft', 'pageright', 'pageinner', 'pageouter',
%         'textareacenter', 'textarealeft', 'textarearight', 'textareainner', 'textareaouter'.
%       * Added 'noindent' key.
%       * Added \newadjustimage and \NewAdjustImage commands to define custom versions of \adjustimage with predefined key
%         lists. This include variation to renew, provide and declare such macros.
%       * Added \provideadjustboxenv and \declareadjustboxenv.
%       * Added \provideadjustboxcmd and \declareadjustboxcmd.
% }
% \changes{v1.3}{2020/08/19}{%^^A
%       * Added support for (hopefully) all 'graphicx' keys.
%       * Added missing \leavevmode for framing keys.
%       * Added key "leavevmode" on request of Frank Mittelbach.
%       * Added 'process' key.
%       * Added 'clap' key on user request.
%       * Removed old graphicx key 'print'.
%       * trimclip: Added explicit luatex driver which uses the pdftex driver to avoid the fallback to PGF driver.
% }
% \changes{v1.3a}{2022/10/17}{%^^A
%       * Updated documentation with new repository URL and new email address.
%       * Added dependency file for texlive.
% }
%
% \GetFileInfo{adjustbox.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let}
%
% \author{Martin Scharrer}
% \email{martin.scharrer@web.de}
% \repository{https://github.com/MartinScharrer/adjustbox/}
% \ydocpdfsettings
% \maketitle
%
% \makeatletter
% \def\LATeX{\texorpdfstring{(L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts
%  \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em)\TeX}{(La)TeX}}
% \makeatother
%
% \begin{abstract}
%  This package allows to adjust general \LATeX\ material in several ways using a key=value interface.
%  It got inspired by the interface of \Macro\includegraphics from the \pkg{graphicx} package.
%  This package also loads the \pkg{trimclip} package which code was once included in this package.
% \end{abstract}
% \clearpage% \tableofcontents
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Introduction} ^^A (((
% The standard \LaTeX{} package \pkg{graphicx} (the extended version of \pkg{graphics}) provides the macro
% \Macro\includegraphics[<options>]{<file name>} which can be used to include graphic files. Several options can be used
% to scale, resize, rotate, trim and/or clip the graphic.
% The macros \Macro\scalebox, \Macro\resizebox and \Macro\rotatebox are also provided to apply the corresponding
% operation on \LATeX{} material, which is subsequently placed inside a \Macro\hbox.
% However no macros are provided to trim or clip \LATeX{} material, most likely because this operations
% are not done by \TeX{} but by the output format, i.e.\ using PostScript (PS) or PDF operations.
%
% This package started by providing the missing macros \Macro\clipbox and \Macro\trimbox.
% Then a general \Macro\adjustbox macro which allows to combine many operations using a key=value syntax was added and
% further extended until it represented the main feature of this package.  Newly added keys are also provided as
% dedicated macros and corresponding environments.
% The \Macro\clipbox and \Macro\trimbox macros were then moved together with the required output driver code to a
% dedicated package \pkg{trimclip}. This allows documents and other packages to use these basic features without
% loading the full \pkg{adjustbox} package.
%
%
% ^^A )))2
% \subsection{Dependencies} ^^A (((2
% The \pkg{adjustbox} package and its \pkg{trimclip} sub-package require the author's other packages \pkg{adjcalc}
% (bundled with \pkg{adjustbox}) and \pkg{collectbox}, as well as the packages \pkg{xkeyval}, \pkg{graphicx} and \pkg{ifpdf}.
% The \pkg{varwidth} package is automatically loaded if installed, otherwise the \Key{varwidth} and \Key{stack} keys are
% disables as well as \Macro\stackbox and the \env{stackbox} environment.
% The \pkg{ifoddpage} package is automatically loaded if installed, otherwise the \Key{outer} and \Key{inner} keys are
% disables as well as \Macro\outersidebox and \Macro\innersidebox macros and corresponding environments.
% For features which use colors the \pkg{xcolor} package must also be loaded manually (the \pkg{color} package is fine, too).
% The experimental |split| and |pagebreak| features also require the \pkg{storebox} package to be loaded manually.
%
% ^^A )))2
% \subsection{Verbatim Support}\label{sec:verbatim} ^^A (((2
% The macros provided by \pkg{adjustbox} and \pkg{trimclip} read the content as a horizontal \TeX{} box and not as an
% macro argument in order to support verbatim content.
% This means that the braces around the content can also be written as \Macro\bgroup and \Macro\egroup:
% \begin{macroquote}
%   \adjustbox{key=value,\ldots}\AlsoMacro\bgroup~<content>\AlsoMacro\egroup
% \end{macroquote}
% Special care is taken to allow the \meta{content} to be a single macro (except \Macro\bgroup) without any braces:
% \begin{macroquote}
%   \adjustbox{key=value,\ldots}\AlsoMacro\somemacro
% \end{macroquote}
% This is to support the habit of some \LaTeX{} users to drop the braces for single token arguments.
% All environments support verbatim content.
% Note that the plain\TeX{} syntax for environments (\Macro\adjustbox\ldots\Macro\endadjustbox) can not be used
% because it will trigger \Macro\adjustbox as a macro. However, the braces around the content can be replaced
% by \Macro\bgroup and \Macro\egroup.
%
% ^^A )))2
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Package Options}\label{sec:options} ^^A (((
% This package accepts the following options:
%
% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
%   \oitem{export} Exports the keys of \Macro\adjustbox to \Macro\includegraphics so that they can be used with this
%                  macro as well. Note that not all keys will works properly with \Macro\includegraphics as its internal
%                  code does not support all features. If problems occur the option |Export| should be used.
%                  For new documents it is recommended to use the macro \Macro\adjustimage{<keys>}{<filename>} instead.
%   \oitem{Export} Sets \Macro\includegraphics to be identical to \Macro\adjincludegraphics, which also allows the usage
%                  of all \Macro\adjustbox keys.
%   \oitem{pgf} This option is passed to \pkg{trimclip} and makes it to use the \pkg{pgf} package for all clip operations.
%               This overrides all automatically detected drivers.
%   \oitem{PGF} This option will pass the \opt{pgf} to \pkg{trimclip} and enable the \opt{pgfmath} option of
%               \pkg{adjcalc}, i.e.\ the \pkg{pgf}
%               package is used for clip operations and the \pkg{pgfmath} pacakge is used to parse length arguments.
%   \oitem{minimal} Only load a minimal set of code, i.e.\ \pkg{trimclip} and \Macro\adjustbox/\env{adjustbox}
%               but no additional keys and macros.
%  \end{description}
%
% \noindent
% The following options define the way length values are processed by the provided macros.
% They are passed to the \Macro\adjcalcset macro of the \pkg{adjcalc} package and load any required packages.
% These options can also be used as local keys on \Macro\adjustbox. See the \pkg{adjcalc} manual for more details on
% them.
%
% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
%   \oitem{etex} Uses the $\epsilon$-\TeX\ primitive \Macro\glueexpr to parse length values.
%   \oitem{calc} Uses the \pkg{calc} package to parse length values.
%   \oitem{pgfmath} Uses the \pkg{pgfmath} package of the \pkg{pgf} bundle to parse length values.
%   \oitem{defaultunit}\MacroArgs!{\hspace*{-1ex}}!'='<unit>\relax
%      This sets the default unit used for values which accept length without units, e.g.\ \Key{trim}.
% \end{description}
%
% \noindent
% In addition, all driver options of the \pkg{trimclip} package are also accepted and passed to it.
% All unknown options are passed to the \pkg{graphicx} package, which might pass them down to the \pkg{graphics}
% package.
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Main Macros}^^A (((
% The following macros and environments represent the main functionality of this package.
% Special care is taken so that the macros and the environments can have the same name.
% For starred environments the star can be either part of the name or an optional argument.
%
% \subsection{Adjust Box Content} ^^A (((2
% \vskip-\lastskip
% \DescribeMacro\adjustbox{<key=value, \ldots>}{<content>}
% The \Macro\adjustbox macro allows the modification of general \LATeX\ content using a key=value syntax.
% This can be seen as an extension of the \Macro\includegraphics macro from images to any \LATeX{} material.
% The macro supports the all \Macro\includegraphics keys and many more.
% However, they are provided as a mandatory not as an optional argument, because an \Macro\adjustbox without options
% would not make sense and can be replaced by a simple \Macro\mbox.
% As already stated the content is read as a box, not as a macro argument, therefore verbatim or other special
% content is supported and the braces can also be replaced by \Macro\bgroup and \Macro\egroup.
% There is no starred version of this macro.
%
% \DescribeEnv[<content>]{adjustbox}{<key=value, \ldots>}
% The environment version of \Macro\adjustbox. A difference to the macro is that it includes \Macro\noindent
% to suppress paragraph indention.
%
% \Needspace*{5\baselineskip}
% \clearpage\subsection{Adjust Images}
% \vskip-\lastskip
% \DescribeMacro\adjustimage{<key=value, \ldots>}{<image filename>}
% This macro can be used as an extension of \Macro\includegraphics.
% While \Macro\adjustbox is based on the same interface as \Macro\includegraphics it provides more keys and allows
% global keys set by \Macro\adjustboxset. Most keys can be exported to \Macro\includegraphics using the \opt{export}
% option, but there is no support for global keys\footnote{However some keys, but not all, can be set globally using
% \Macro\setkeys{Gin}{<includegraphic key=value pairs>}}.  Therefore it can make sense to use
% \Macro\adjustbox{<key/value pairs>}{\AlsoMacro\includegraphics{<filename>}}, which is the definition of
% \Macro\adjustimage.
% However, it does not use \Macro\includegraphics directly, but an internal macro, to allow the redefinition of
% \Macro\includegraphics.
% This macro does not require the \opt{export} option and therefore helps to avoid option clashes
% if \pkg{adjustbox} is loaded at several places.
%
%
% \DescribeMacro\adjincludegraphics[<key/value pairs>]{<image filename>}
% Like \Macro\adjustimage but in the same format as \Macro\includegraphics, i.e.\ with an optional argument.  This macro
% allows to use all features of \Macro\adjustbox on images, however special care must be taken if the values include
% `|[ ]|'.  In this case either the whole value or the while optional argument must be wrapped in `|{ }|':
% \Macro\adjincludegraphics['key='{[..]},...]{..} or \\\Macro\adjincludegraphics[{key=[..],...}]{..}. \\
% It is possible to redefine \Macro\includegraphics to \Macro\adjincludegraphics and this is done by
% the \opt{Export} option (not to be confused with the \opt{export} option).
%
% ^^A )))2
% \clearpage\subsection{Defining custom environments and macros} ^^A (((2
% After \pkg{adjustbox} is used to define custom environments to format specific content.
% If an environment contains other environments these are often written in the plain form \Macro\foo \ldots
% \Macro\endfoo to avoid the overhead of \Macro\begin and \Macro\end and to keep the outer environment name for
% meaningful error messages. As mentioned, the dual nature of \Macro\adjustbox which will detect if it is used
% as environment of macro does not permit this plain form, which can be a pitfall for custom environment definitions.
% Instead the macro form \Macro\adjustbox{<key=value>}\AlsoMacro\bgroup \ldots \Macro\egroup should be used.
% To simplify custom environment definitions based on \Macro\adjustbox/\env{adjustbox} the following macros are
% provided.
%
%
% \DescribeMacro\newadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>}
% This declaration defines an environment and macro with the given name which will apply the given \pkg{adjustbox} keys
% to its content. The environment/macro can also posses arguments, including one leading optional argument, which can be
% used inside the key=value pairs. It is recommended to wrap the arguments into braces, e.g.\ use `|{#1}|' instead of
% `|#1|' etc., to avoid issues with potentially included commas and equal signs.
% The number and type of arguments are defined using two optional arguments in the same
% way as for \Macro\newcommand and \Macro\newenvironment.
%
%
% \DescribeMacro\newadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>}
% This declaration works similar to the unstarred version but only defines an environment.
% This environment can therefore be used like any other normal \LaTeX\ environment, including in its plain
% form {\macrodescstyle\textbackslash\meta{name}} \ldots {\macrodescstyle{\textbackslash end\meta{name}}}.
%
%
% \DescribeMacro\renewadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>}
% \DescribeMacro\renewadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will redefine an existing macro/environment and cause an
% error if it was not yet defined.
%
%
% \DescribeMacro\provideadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>}
% \DescribeMacro\provideadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will define a macro/environment only if it does not exists
% yet.
%
%
% \DescribeMacro\declareadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>}
% \DescribeMacro\declareadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will always define a macro/environment even if it does already exist.
%
%
% \DescribeMacro\newadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% This declaration defines a macro which applies the given \pkg{adjustbox} keys to its content.
% As with \Macro\adjustbox the content is read as box, not as macro argument.
% The macro arguments (if any) are defined in the same way as with \Macro\newcommand.
% The arguments can then be used inside the key=value pairs. The number of arguments does not
% include the content.
% This declaration is intended if no environment form is required and is more efficient than the dual declaration.
%
% \begin{example}
%   \begin{examplecode}
%   \newadjustboxcmd{\frotate}[1]{rotate={#1},fbox}%
%   \frotate{30}{Text}
%   \end{examplecode}
% \end{example}
%
% \DescribeMacro\renewadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxcmd but will redefine an existing macro and cause an
% error if it was not yet defined.
%
%
% \DescribeMacro\provideadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxcmd but will define the macro only if it does not exist yet.
%
%
% \DescribeMacro\declareadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustboxcmd but will define the macro in any case even if it does exist yet.%
%
%
% \DescribeMacro\newadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% \DescribeMacro\renewadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% \DescribeMacro\provideadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% These macros allow to define new versions of \Macro\adjustimage with predefined key lists.
% The new define image macros can also have arguments which can be used in the predefined key list to
% substitude values or one or multiple keys.
%
% They work like \Macro\newcommand, \Macro\renewcommand and \Macro\providecommand, respectively, where
% \meta{num} is the number of arguments and \meta{default} provides a default value for the then optional
% first argument. However, instead of a macro content a \meta{key=value} list must be present, which can
% contain the arguments (|#1|, |#2|, etc). If arguments are used as values they should be wrapped in braces.
% If there are only part of a value the whole value should be wrapped in braces. This is to avoid causes commas
% inside the arguments to cause issues with the key=value list.
%
% \begin{example}
%   \begin{examplecode}
%   \newadjustimage{\myimage}[2][red]{width={#2},cfbox={#1}}%
%   \myimage{2cm}{example-image}
%   \myimage[blue]{2cm}{example-image}
%   \end{examplecode}
% \end{example}
%
% \DescribeMacro\declareadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>}
% Like \Macro\newadjustimage but will not cause an error if the macro is already defined.
%
%
% \DescribeMacro\NewAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>}
% \DescribeMacro\RenewAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>}
% \DescribeMacro\ProvideAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>}
% \DescribeMacro\DeclareAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>}
% These macros also allow to define new versions of \Macro\adjustimage with predefined key lists, but use
% the \pkg{xparse} package (which must be loaded separately!) and its macros \Macro\NewDocumentCommand, \Macro\RenewDocumentCommand,
% \Macro\ProvideDocumentCommand and \Macro\DeclareDocumentCommand instead of the standard \LaTeX\ macro creation
% macros. This allows a larger variety of optional and mandatory arguments. Please see the \pkg{xparse} manual
% for more details.
%
% \begin{example}
%   \begin{examplecode}
%   \NewAdjustImage{\myimage}{O{red}m}{width={#2},cfbox={#1}}%
%   \myimage{2cm}{example-image}
%   \myimage[blue]{2cm}{example-image}
%   \end{examplecode}
% \end{example}
%
%
% ^^A )))2
% \clearpage\subsection{Setting keys globally} ^^A (((2
% \vskip-\lastskip
% \DescribeMacro\adjustboxset{<global keys to be executed \emph{before} local keys>}
% \DescribeMacro\adjustboxset*{<global keys to be executed \emph{after} local keys>}
% Using these two macros all keys can be set globally, i.e.\ for all future \Macro\adjustbox macros and \env{adjustbox}
% environments.  Note that these settings are actually \emph{local} to the current \TeX\ group and only really global if
% used in the preamble or outside any group.  The normal macro will place all given keys before the keys used in first
% argument of \Macro\adjustbox\ / \env{adjustbox}, while the starred version will place them afterwards.
%
% If these macros are used several times there keys are accumulated. This happens in the given order for the normal
% version and in reversed order for the starred version, i.e.\ the keys of further \Macro\adjustboxset or
% \Macro\adjustboxset* are always added so they face inwards.  If used without any keys but an empty argument, all keys
% previously set with the same macro are removed (from the current \TeX\ scope).  This means \Macro\adjustboxset{}
% clears all keys set be previously usages of \Macro\adjustboxset{<keys>} and \Macro\adjustboxset*{} clears all set by
% \Macro\adjustboxset*{<keys>}.  Such resets are again local to the current \TeX\ group.
%
%
% \begin{examples}
% The macros:
% \begin{macroquote}
% \adjustboxset{keya=1} \\
% \adjustboxset*{keyc=3}\\
% \adjustbox{keyb=2}{content}
% \end{macroquote}
% are effectively the same as:
% \begin{macroquote}
% \adjustbox{keya=1,keyb=2,keyc=3}{content}
% \end{macroquote}
% \par\medskip\noindent
% The macros:
% \begin{macroquote}
% \adjustboxset{keya=1,keyb=2} \\
% \adjustboxset{keyc=3,keyd=4} \\
% \adjustboxset*{keyg=7,keyh=8}\\
% \adjustboxset*{keyi=9,keyj=10}\\
% \adjustbox{keye=5,keyf=6}{content}
% \end{macroquote}
% are effectively the same as:
% \begin{codequote}
%   \AlsoMacro\adjustbox'{keya=1,keyb=2,keyc=3,keyd=4,keye=5,keyf=6,'\\
%            !\hskip0pt!'            keyi=9,keyj=10,keyg=7,keyh=8}'{content}
% \end{codequote}
% \end{examples}
%
% ^^A )))2
% \clearpage\subsection{Argument Values}\label{sec:argval} ^^A (((2
% All length values given in the arguments of all macros and keys provided by this package are parsed
% by and advanced version of \Macro\setlength\relax (called \Macro\adjsetlength) which uses either $\epsilon$-\TeX\
% expressions (default), the \pkg{calc} package (default fall-back) or the \Macro\pgfmathparse of the \pkg{pgf} package.
% This allows for arithmetic expressions in these arguments. See the package options in \autoref{sec:options} to learn
% how to change the used length parser.  Note that early versions of this package used \Macro\pgfmathparse by default.
% Older documents therefore might need now use the \opt{pgfmath} option to compile correctly.
%
% Note that the four values for \Macro\trimbox and \Macro\clipbox as well as for the
% \Key{trim} and \Key{viewport} option of \Macro\adjustbox are separated by spaces. If the expression of any of this
% values holds a space or ends with a macro (eats trailing spaces!) it must be wrapped into braces "{ }".
%
%
% \DescribeMacros
%    \hbox{\Macro\width~~~\Macro\height~~~\Macro\depth~~~\Macro\totalheight}%
% \endDescribeMacros
% These \LaTeX{} lengths hold the current dimensions of the content and can be used as part all length arguments.  When
% the size of the content is changed by a key these lengths will be adjusted to hold the new size for all further keys.
% The totalheight is the height plus depth. With the \pkg{patch} option these lengths can also be used for
% \Macro\includegraphics.
%
% \DescribeMacros
%    \hbox{\Macro\Width~~~\Macro\Height~~~\Macro\Depth~~~\Macro\Totalheight}%
% \endDescribeMacros
% These \LaTeX{} lengths hold the original dimension of original unchanged content and are not modified.  They are
% useful if the size of the content is modified by several keys, but further keys should still work relative to the
% original content.
%
%
% \DescribeMacro\smallestside
% This macro expands to either \Macro\width or \Macro\totalheight whatever is smaller.
%
% \DescribeMacro\largestside
% This macro expands to either \Macro\width or \Macro\totalheight whatever is larger.
%
% \DescribeMacro\Smallestside
% This macro expands to either \Macro\Width or \Macro\Totalheight whatever is smaller.
%
% \DescribeMacro\Largestside
% This macro expands to either \Macro\Width or \Macro\Totalheight whatever is larger.
%
%
% \subsubsection*{Default unit}
% If no unit is provided for of the bounding box coordinates (left, bottom, right, top) in the trim and clip features then
% PostScript points (\emph{big points}, bp, $72\,\text{bp}=1\,\text{inch}$) are used, as it is the default behaviour of
% the \Key{trim} and \Key{viewport} options of \pkg{graphicx}'s \Macro\includegraphics. Note that \pkg{graphicx}
% converts all values, independent if a unit is provided or not, internally to bp, because graphics where traditionally
% stored in Encapsulated PostScript (EPS) files. The more modern PDF files also use bp instead of pt.  Because the
% \pkg{adjustbox} package macros target \LATeX{} material and users will mostly use pt values this internal conversion
% to bp got disabled for them to avoid unnecessary rounding errors. Since v0.5 the default unit can be changed using the
% |defaultunit|\MacroArgs'='<unit>\relax key (which is also usable as global package option).
%
% ^^A )))2
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Adjustbox Keys} ^^A (((
% This packages provides the following \Macro\adjustbox keys with matching macros and environments.
%
%
% \subsection{Trimming and Clipping} ^^A (((2
% The following keys allow content to be trimmed (i.e.\ the official size is made smaller, so the remaining material
% laps over the official boundaries) or clipped (overlapping material is not displayed).
% These keys come in different variants, where the lower-case keys represent the behavior of
% the corresponding \Macro\includegraphics keys. The corresponding macros (\Macro\trimbox, \Macro\clipbox, etc.)
% and environments (\env{trimbox}, \env{clipbox}, etc.) are included in the
% accompanying \pkg{trimclip} package and are explained in its manual.
%
% \DescribeKey{trim}'='<all sites>
% \DescribeKey{trim}'='<left/right>~<top/bottom>
% \DescribeKey{trim}'='<left>~<bottom>~<right>~<top>
% This key represents the original \Key{trim} key of \Macro\includegraphics but accepts its value in different forms.
% Unlike most other keys it always acts on the original content independent in which order it is used with other keys.
% If only one value is given it will be used for all four sites.
% If only two values are given, seperated by a space, the first one will be used for the left and right side and the second for the
% bottom and top side.
%
%
% \DescribeKey{viewport}'='<left>~<bottom>~<right>~<top>
% This key represents the original \Key{viewport} key of \Macro\includegraphics.
% It always trims the original content to the given view port independent from its position.
%
% \DescribeKey{clip}
% \DescribeKey{clip}'=true|false'
% This boolean key represents the original \Key{clip} key of \Macro\includegraphics.
% It is intended to be used to make \Key{trim} or \Key{viewport} clip the trimmed material.
% Note that the material will still be part of the output file but is simply not shown.
% It might be exported from the output file using special tools, so using it to censor classified information is a
% bad idea.
%
%
% \DescribeKey{Trim}'='<all sites>
% \DescribeKey{Trim}'='<left/right>~<top/bottom>
% \DescribeKey{Trim}'='<left>~<bottom>~<right>~<top>
% \DescribeKey{Viewport}'='<left>~<bottom>~<right>~<top>
% The normal \Key{trim} and \Key{viewport} keys are applied on the original content before any resizing or (most) other
% keys take effect.  This is because for \Macro\includegraphics the trimming is done by the internal graphic driver,
% while the effects can be applied later (but can also be driver dependent).
% If the \Key{trim} and \Key{viewport} keys are used multiple times only the last values will be used for the trimming,
% i.e. the content is only trimmed once. The upper case variants \Key{Trim} and \Key{Viewport} will wrap the content
% internally in a \Macro\trimbox or \Macro\trimbox*\relax macro which can be applied multiple times, e.g.\ before and
% after the content is rotated.  These two keys awaits the same format as the original keys. However, the \Key{clip} key
% has no effect on them.
%
%
% \DescribeKey{Clip}'='<all sites>
% \DescribeKey{Clip}'='<left/right>~<top/bottom>
% \DescribeKey{Clip}'='<left>~<bottom>~<right>~<top>
% \DescribeKey{Clip*}'='<left>~<bottom>~<right>~<top>
% The \Key{Clip} key will clip the given amounts from the current content and can be used several times if required.
% The starred version will use the given coordinates as \Key{viewport}.
% These keys work by wrapping the content internally in a \Macro\clipbox or \Macro\clipbox*\relax macro.
%
%
% \DescribeKey{rndcorners}'='<radius for all four corners>
% \DescribeKey{rndcorners}'='<left corners>~<right corners>
% \DescribeKey{rndcorners}'='<upper left>~<upper right>~<lower left>~<lower right>
% This key produces round corners by clipping the content. This is done using the same way as the
% above clipping keys but instead of a rectangle clipping path one with quarter circles is used.
% The radius of the every round corner can be given separately if wanted. If only one value is given
% it is used for all four corners. If only two values are given they will be used for the left and right side, respectively.
% A value of 0pt will produce a normal rectangular corner.
% No radius should be larger than half the smallest side (minimum of \Macro\width and \Macro\totalheight).
%
% Please see also the related keys \Key{rndfbox} and \Key{rndframe}, which allow to add a rounded frame around the content as well.
%
%
% ^^A )))2
% \clearpage\subsection{Margins and Vertical Spacing} ^^A (((2
% \vspace{-\baselineskip}
%
% \DescribeKey{margin}'='<all sites>
% \DescribeKey{margin}'='<left/right>~<top/bottom>
% \DescribeKey{margin}'='<left>~<bottom>~<right>~<top>
% This key can be used to add a margin (white space) around the content. It can be seen as the opposite of \Key{Trim}.
% The original baseline of the content is preserved because \meta{bottom} is added to the depth.
% It is also available under the alternative name \Key{padding}, which can be used to more visually distinguish an inner
% margin from an outer margin e.g.\ if a frame is added.
%
% \begin{example}
%   \begin{examplecode}
%   Before \adjustbox{padding=1ex 2ex 3ex 4ex,frame,margin=1ex 2ex 3ex 4ex}{Text} After
%   \end{examplecode}
% \end{example}
%
% \DescribeKey{margin*}'='<all sites>
% \DescribeKey{margin*}'='<left/right>~<top/bottom>
% \DescribeKey{margin*}'='<left>~<bottom>~<right>~<top>
% This starred version is almost identical to the normal \Key{margin} key, but also raises the content by the \MacroArgs<bottom>
% amount, so that the original depth is preserved instead of the original baseline.
% Note that while \Key{margin} is basically the opposite of \Key{Trim}, \Key{margin*} is not the opposite of \Key{Trim*}.
% Instead it also takes the same values as the unstarred key and not viewport values like \Key{Trim*}.
% An alternative name of \Key{margin*} is \Key{padding*}.
%
% \begin{example}
%   \begin{examplecode}
%   Before \adjustbox{padding*=1ex 2ex 3ex 4ex,frame,margin*=1ex 2ex 3ex 4ex}{Text} After
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{vspace}'='<above/below>
% \DescribeKey{vspace}'='<above>~<below>
% The \Key{vspace} key adds a vertical space before and after the content.
% This is done by adding paragraph breaks and \Macro\vspace macros, which will yield better spacing between
% paragraphs then when using the \Key{margin} key.
% However \Key{vspace} forces vertical mode around the content. Adding further keys after \Key{vspace} will force
% restricted horizontal mode again and the vertical space will be ignored. For this situation the \Key{margin} key is
% better suited.
%
% \DescribeKey{vspace*}'='<above/below>
% \DescribeKey{vspace*}'='<above>~<below>
% Identical to \Key{vspace} but uses \Macro\vspace'*' instead.
% The difference is that the vertical space is not ignored at page breaks, but its full amount is always forced.
%
%
% ^^A )))2
% \clearpage\subsection{Minimum and Maximum Size} ^^A (((2
% The following keys allow to set a minimum or maximum size.
% The content will be scaled down or up if required.
%
%
% \DescribeKey{min width}'='<width>
% \DescribeKey{max width}'='<width>
% \DescribeKey{min height}'='<height>
% \DescribeKey{max height}'='<height>
% \DescribeKey{min totalheight}'='<total height>
% \DescribeKey{max totalheight}'='<total height>
% These keys allow to set the minimum and maximum width, height or totalheight of the content.
% The current size of the content is measured and the content is resized if the constraint is not already met,
% otherwise the content is unchanged. Multiple usages of these keys are checked one after each other, and therefore
% it is possible that a later one is undoing the size changes of an earlier one.
% A good example is \Key{max width}'='\AlsoMacro\textwidth which will limit large content to the text width but will not affect smaller
% content.
%
% \DescribeKey{min size}'='{<width>}{<height>}
% \DescribeKey{max size}'='{<width>}{<height>}
% \DescribeKey{min totalsize}'='{<width>}{<total height>}
% \DescribeKey{max totalsize}'='{<width>}{<total height>}
% These keys allow to specify the minimum or maximum width and (total)height of the content together,
% which is more efficient than using the width and (total)height keys described earlier.
%
%
%
% \DescribeMacro\minsizebox{<width>}{<height>}{<content>}
% \DescribeMacro\minsizebox'*'{<width>}{<totalheight>}{<content>}
% This macro is like \Macro\resizebox of the \pkg{graphics/x} package, but only resizes the content if its natural size is smaller
% than the given \meta{width} or \meta{height}.
% If only one value should be set the other one can be replaced by "!".
% If required the content is scaled up so that the width and height is equal or larger than the given values, but does not change
% the aspect ratio.
% The star variant uses the total height instead of only the height.
% This macro is used internally for the \Key{min width}, \Key{min height}, \Key{min totalheight} and \Key{min totalsize} keys.
%
% \begin{examples}
%   \begin{examplecode}
%   \minsizebox{3cm}{2ex}{Some Text} which will be enlarged
%   \end{examplecode}
%   \begin{examplecode}
%   \minsizebox{!}{4ex}{\fbox{Some Text}} which will be enlarged
%   \end{examplecode}
%   \begin{examplecode}
%   \minsizebox*{!}{4ex}{\fbox{Some Text}} which will be enlarged
%   \end{examplecode}
%   \begin{examplecode}
%   \minsizebox{3cm}{!}{Some Text} which will be enlarged
%   \end{examplecode}
%   \begin{examplecode}
%   \minsizebox{1cm}{1ex}{Some Text}, already large enough
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeMacro\maxsizebox{<width>}{<height>}{<content>}
% \DescribeMacro\maxsizebox'*'{<width>}{<totalheight>}{<content>}
% This macro is like \Macro\resizebox of the \pkg{graphics/x} package, but only resizes the content if its natural size is larger
% than the given \meta{width} or \meta{height}.
% If only one value should be set the other one can be replaced by "!".
% If required the content is scaled down so that the width and height is equal or smaller than the given values, but does not change
% the aspect ratio.
% The star variant uses the total height instead of only the height.
% This macro is used internally for the \Key{max width}, \Key{max height}, \Key{max totalheight} and \Key{max totalsize} keys.
%
% \begin{examples}
%   \begin{examplecode}
%   \maxsizebox{1cm}{1ex}{Some Text} which will be reduced
%   \end{examplecode}
%   \begin{examplecode}
%   \maxsizebox{!}{1ex}{\fbox{Some Text}} which will be reduced
%   \end{examplecode}
%   \begin{examplecode}
%   \maxsizebox*{!}{1ex}{\fbox{Some Text}} which will be reduced
%   \end{examplecode}
%   \begin{examplecode}
%   \maxsizebox{1cm}{!}{Some Text} which will be reduced
%   \end{examplecode}
%   \begin{examplecode}
%   \maxsizebox{3cm}{1cm}{Some Text}, already small enough
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{warn width}
% \DescribeKey{warn width}=<max width>
% If this key is used the current width of the content is measured and compared with the given maximum width (default is
% \Macro\linewidth).
% If the content is wider than this value by more than the \TeX\ length \Macro\hfuzz\relax (by default 0.1pt)
% an \emph{Overfull hbox} warning is produced.
% The warning will include the source code position and the information that it was an |adjustbox| not a normal
% paragraph:
% \par\smallskip\par
% {\ttfamily Overfull |\hbox| (X.Ypt too wide) in adjustbox at line N}
%
% {\ttfamily Overfull |\hbox| (X.Ypt too wide) in adjustbox at lines N-M}
% \par\smallskip\par\noindent
% Note that this key is not able to take any horizontal space before the |adjustbox|
% into account. This includes a paragraph indention which might be present with \Macro\adjustbox.
%
% This key is useful to be used before the horizontal alignment keys which change the official width of the content
% and prevent the normal \emph{Overfull} warnings to take affect.
%
%
% ^^A )))2
% \Needspace*{8\baselineskip}
% \clearpage\subsection{Scaling} ^^A (((2
% \vspace{-\baselineskip}
%
% \DescribeKey{scale}'='<factor>
% \DescribeKey{scale}'='{<h-factor>}{<v-factor>}
% The normal \Key{scale} key of \pkg{graphicx} only allows for one scale factor which is used for both the horizontal and vertical scaling.
% With \pkg{adjustbox} it is also possible to provide the horizontal and vertical scale factors separately.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{scale=2}{Some text!}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{scale={2}{1}}{Some text!}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{reflect}
% This key reflects the content by using \Macro\reflectbox internally, which is identical to \Macro\scalebox{-1}[1],
% i.e.\ this key is identical to \Key{scale}'='{-1}{1}.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{reflect}{Some text!}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeMacro\scalebox{<h-factor>}[<v-factor>]{<content>}
% \DescribeMacro\reflectbox{<content>}
% These macros is provided by the loaded \pkg{graphicx} package and only mentioned here for the sake of completeness.
% See the |grfguide| for more details.
%
%
% ^^A )))2
% \clearpage\subsection{Frame} ^^A (((2
% The following keys can be used to draw frames around the content.
%
% \DescribeKey{fbox}
% \DescribeKey{fbox}'='<rule width>
% \DescribeKey{fbox}'='<rule width>~<sep>
% \DescribeKey{fbox}'='<rule width>~<sep>~<margin>
% Draws a framed box around the content like \Macro\fbox would do.
% Using the optional space separated values the rule width, the separation (inner padding) and the outer margin can be set.
% If not they default to the values \Macro\fbox uses by default: \Macro\fboxrule, \Macro\fboxsep and zero margin.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{fbox}{Like \cs{fbox}}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{fbox=1pt}{With 1pt rule width}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{fbox=1pt 2pt}{With 1pt rule width and 2pt separation}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{fbox={\fboxrule} 1pt}{With normal rule width and 1pt separation}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{fbox=1pt 1pt 1pt}{With 1pt for rule width, separation and outer margin}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{frame}
% \DescribeKey{frame}'='<rule width>
% \DescribeKey{frame}'='<rule width>~<sep>
% \DescribeKey{frame}'='<rule width>~<sep>~<margin>
% The \Key{frame} key has the same effect as the \Key{fbox} key but is modeled after \LaTeX's \Macro\frame macro (not the version \cls{beamer} defines).
% This means it adds a tight frame with zero separation around the content by default. Besides that it accepts the same space separated values.
% This key is useful to easily add a tight frame around images where the normal separation wouldn't fit.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{frame}{Tight box}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{cfbox}'='<color>
% \DescribeKey{cfbox}'='<color>~<rule width>
% \DescribeKey{cfbox}'='<color>~<rule width>~<sep>
% \DescribeKey{cfbox}'='<color>~<rule width>~<sep>~<margin>
% Identical to \Key{fbox} but uses the given color for the frame.
% The \pkg{xcolor} package must be loaded manually in order for this key to work.
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{cfbox=blue 1pt}{Like a blue \cs{fbox} with \cs{fboxrule}=1pt}
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{cframe}'='<color>
% \DescribeKey{cframe}'='<color>~<rule width>
% \DescribeKey{cframe}'='<color>~<rule width>~<sep>
% \DescribeKey{cframe}'='<color>~<rule width>~<sep>~<margin>
% Identical to \Key{frame} but uses the given color for the frame.
% The \pkg{xcolor} package must be loaded manually in order for this key to work.
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{cframe=blue!50!green}
%       {Like a blue and green \cs{frame}}
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{rndframe}'='<radius for all four corners>
% \DescribeKey{rndframe}'='<left corners>~<right corners>
% \DescribeKey{rndframe}'='<upper left>~<upper right>~<lower left>~<lower right>
% \DescribeKey{rndframe}'='{<options>}{<radius for all four corners>}
% \DescribeKey{rndframe}'='{<options>}{<left corners>~<right corners>}
% \DescribeKey{rndframe}'='{<options>}{<upper left>~<upper right>~<lower left>~<lower right>}
%
% \begingroup
% \colorlet{keydesc}{keydesc!50!green}
% \DescribeKey{color}'='{<color>}
% \DescribeKey{color*}'='{<color command>}
% \DescribeKey{width}'='{<rule width>}
% \DescribeKey{sep}'='{<rule separation>}
%
% \DescribeKey{clip}
% \DescribeKey{clip}'=true|false'
% \endgroup
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{scale=3,bgcolor=gray,rndframe={color=red,width=2\fboxrule,sep=2\fboxsep}{15pt}}
%       {\Huge XXXX}%
%   \end{examplecode}
% \end{example}
%
% \DescribeKey{rndcornersbox}
% Like \Key{rndframe} (see argument list there) but only clips the corners without drawing a frame.
%
% \DescribeKey{rndfbox}
% Like \Key{rndframe} (see argument list there) but with preset
% \begingroup
% \colorlet{keydesc}{keydesc!50!green}
% \Key{sep}'='0pt.
% \endgroup
%
% \DescribeMacro\rndcornersbox
% \DescribeMacro\rndframebox
% \DescribeMacro\rndfbox
% Standalone macro versions of the corresponding keys. See there for the list of arguments.
%
% ^^A )))2
% \clearpage\subsection{Vertical Alignment} ^^A (((2
% The following keys can be used to adjust the vertical alignment and size of the content.
%
% \DescribeKey{valign}'='<letter>
% This key allows to vertically align the content to the top, middle and bottom.  The uppercase letters |T|, |M| and |B|
% align to the content top (i.e. all depth, no height), the geometric, vertical center (equal height and depth) and to
% the bottom (all height, no depth), respectively.  This allows the alignment of content of different size, but will not
% result in good alignment with text.  The lowercase letters |t|, |m| and |b| are aligning the content again to the top,
% center and bottom but take the current text size in account.
% The |t| letter leaves a certain height given by the macro\footnote{A macro and not a length is used to allow for
% font size relative values like \texttt{1ex}.} \Macro\adjboxvtop\relax
% (by default set to the height of \Macro\strut\relax, i.e.\ |\ht\strutbox|, which is |.7\baselineskip|),
% while |b| sets a certain depth given (as negative length) by the macro \Macro\adjboxvbottom\relax
% (by default equal to the (negated) \Macro\strut depth, i.e.\ |-\dp\strutbox|, which is |.3\baselineskip|).
% The |m| letter will center towards the vertical center of the text line which is determined by the macro
% \Macro\adjboxvcenter\relax (by default \texttt{1ex}).
%
% The following table shows the different alignments for three different sized blocks:
%
% \bigskip
% \begingroup
% \def\vr{%
%     \unskip
%     \tikz [gray] {\useasboundingbox (0,0);
%       \draw (-13.5em,0) -- (2.25em,0);
%       \draw (-13.5em,\adjboxvcenter) -- (2.25em,\adjboxvcenter);
%     }%
%     \unskip\ignorespaces
% }%
% \centerline{%
% \begin{tabular}{cccm{2em}}
%  \toprule
%   \texttt{T} & \texttt{M} & \texttt{B} & Text \\
%   \adjustbox{valign=T}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=T}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=T}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   \adjustbox{valign=M}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=M}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=M}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   \adjustbox{valign=B}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=B}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=B}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   Mxy \newline \mbox{\vr Mxy}\newline Mxy \\
%  \midrule
%   \texttt{t} & \texttt{m} & \texttt{b} & Text \\
%   \adjustbox{valign=t}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=t}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=t}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   \adjustbox{valign=m}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=m}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=m}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   \adjustbox{valign=b}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip
%   \adjustbox{valign=b}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip
%   \adjustbox{valign=b}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} &
%   Mxy \newline \mbox{\vr Mxy}\newline Mxy \\
%  \bottomrule
% \end{tabular}}
% \endgroup
%
%
% \DescribeKey{raise}'='<amount>
% \DescribeKey{raise}'='{<amount>}{<height>}
% \DescribeKey{raise}'='{<amount>}{<height>}{<depth>}
% This key uses
% \Macro\raisebox{<amount>}{\ldots} to raise the content upwards for the given \meta{amount} (length).
% A negative length moves the content down.
% The two optional arguments of \Macro\raisebox{<amount>}[<height>][<depth>]{\ldots}\relax are also available
% as optional brace arguments. They can be used to set the official height and depth of the content.
% This is also possible using the \Key{set height} and \Key{set depth} keys.
%
% \begin{examples}
%   \begin{examplecode}
%   Is \adjustbox{raise=1ex}{higher}
%   than the normal text
%   \end{examplecode}
%   \begin{examplecode}
%   Is \adjustbox{raise={1ex}{\height}}{higher}
%   than the normal text but sill has
%   its original official height
%   \end{examplecode}
%   \begin{examplecode}
%   Is \adjustbox{raise={1ex}{1ex}{0pt}}{higher and
%   \rotatebox{-90}{deeper}} but with limited official
%   height and no depth.
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{set height}'='<height>
% This sets the official height of the content without actual changing it. This can be seen as a form of trimming.
% It uses the same internal code as\\
% \Macro\raisebox{'0pt'}[<height>]{<content>}.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{set height=.5\height}
%       {\shortstack{some stacked\\content}}
%   \end{examplecode}
% \end{example}
%
% \DescribeKey{set depth}'='<depth>
% This sets the official depth of the content without actual changing it. This can be seen as a form of trimming.
% It uses the same internal code as\\
% \Macro\raisebox{'0pt'}['\height'][<depth>]{<content>}.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{set depth=0pt}
%       {\shortstack{some stacked\\content
%       with \raisebox{-1ex}{depth}}}
%   \end{examplecode}
% \end{example}
%
% \DescribeKey{set vsize}'='{<height>}{<depth>}
% This sets the official height of depth of the content without actual changing it.
% This key is simply the combination of \Key{set height} and \Key{set depth}.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{set vsize={2pt}{1pt}}
%       {\shortstack{some stacked\\content
%       with \raisebox{-1ex}{depth}}}
%   \end{examplecode}
% \end{example}
%
%
% ^^A )))2
% \clearpage\subsection{Horizontal Alignment} ^^A (((2
% The following keys can be used to adjust the horizontal alignment and size of the content.
%
% \DescribeKey{center}
% \DescribeKey{center}'='<width>
% This key places
% the content in a horizontal box which is by default \Macro\linewidth wide (i.e.\ as wide as a normal text paragraph)
% and centers it in it. The effect is very similar to \Macro\centerline. The original content is unchanged, but simply identical
% white space is added as a left and right margin. This is useful if the content is a figure or table and can be used as a replacement
% for \Macro\centering. One important difference is that the content will then have the given width which might influence (sub-)caption
% placement.
% If the content is wider than the available width it will stick out on both sides equally without causing an overfull hbox warning.
% Note that when \Macro\adjustbox paragraph is used at the beginning of a paragraph the normal paragraph indention is added, which
% will push the while box to the right and might cause an overfull line. In such cases a \Macro\noindent must be added beforehand.
% The \env{adjustbox} environment already uses this macro.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{center}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{center=5cm}{Some content}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{right}
% \DescribeKey{right}'='<width>
% Like \Key{center} this key
% places the content in a box with the given width (by default \Macro\linewidth) but right aligns it.
% If the content is wider than the available width it will stick out into the left side without causing an overfull hbox warning.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{right}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{right=5cm}{Some content}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{left}
% \DescribeKey{left}'='<width>
% Like \Key{center} this key
% places the content in a box with the given width (by default \Macro\linewidth) but left aligns it.
% If the content is wider than the available width it will stick out into the right side without causing an overfull hbox warning.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{left}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{left=5cm}{Some content}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{inner}
% \DescribeKey{inner}'='<width>
% Like \Key{center}, \Key{left} and \Key{right} this key
% places the content in a box with the given width (by default \Macro\linewidth) but aligns it towards the inner margin.
% If the content is wider than the available width it will stick into the outer margin without causing an overfull hbox warning.
% In |twoside| mode this key is equal to \Key{left} for odd pages and equal to \Key{right} for even pages.
% For |oneside| mode it is equal to \Key{left}.
% Note that the page-is-odd test might not always lead to correct results for some material close to a page boundary, because \TeX\
% might not have decided on which page it will be placed. This can be improved by loading the \pkg{changepage} package with the
% \opt{strict} option, which uses a reference to determine the correct page number (and requires the usual additional compiler run).
%
%
% \DescribeKey{outer}
% \DescribeKey{outer}'='<width>
% Identical to \Key{inner} but aligns the content towards the outer margin.
% For |oneside| mode it is equal to \Key{right}.
% If the content is wider than the available width it will stick into the outer inner without causing an overfull hbox warning.
%
%
% \DescribeKey{pagecenter}
% \DescribeKey{pagecenter}'='<width>
% This key centers the content relative to the page and independent from the text area. Afterwards the content has the same distance to the
% left and right page borders. It differs from the \Key{center} key when the left and right page margins are different which is the case in
% |twoside| documents or in environments which change the margins.
%
% Note that the content will look misalign to the text paragraphs before and afterwards and is therefore only
% pleasing for overwide images or similar content.
%
% The optional width defaults to \Macro\linewidth and determines the official width of the content. If a smaller value is selected
% following material will be placed on the same line while maybe overlapping the content.
% Larger values will cause an |Overfull \hbox| warning.
%
% \DescribeKey{pageleftalign}
% \DescribeKey{pageleftalign}'='<width>
% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the left side of the page instead of centering it.
%
% \DescribeKey{pagerightalign}
% \DescribeKey{pagerightalign}'='<width>
% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the left side of the page instead of centering it.
%
% \DescribeKey{pageinner}
% \DescribeKey{pageinner}'='<width>
% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the inner side of the page instead of centering it.
% This assumes that the document is compiled in |twoside| mode.
% In |oneside| mode the macro is identical to \Key{pageleftalign}, i.e. always aligns to the left of the page.
%
% \DescribeKey{pageouter}
% \DescribeKey{pageouter}'='<width>
% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the outer side of the page instead of centering it.
% This assumes that the document is compiled in |twoside| mode.
% In |oneside| mode the macro is identical to \Key{pagerightalign}, i.e. always aligns to the right of the page.
%
%
% \DescribeKey{textareacenter}
% \DescribeKey{textareacenter}'='<width>
% This key centers the content on the text area (the box with size \Macro\textwidth$\times$\Macro\textheight containing the text on a page)
% even if the box is inside an indending environment like \env{enumerate}. For this it is assumed that the adjusted box is on the start
% of a line or paragraph. If this is not the case the content will be overlapping the material on its left side.
%
% The optional width defaults to \Macro\linewidth and determines the official width of the content. If a smaller value is selected
% following material will be placed on the same line while maybe overlapping the content.
% Larger values will cause an |Overfull \hbox| warning.%
%
%
% \DescribeKey{textareatalign}
% \DescribeKey{textareatalign}'='<width>
% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the left side of the text area instead of centering it.
%
% \DescribeKey{textareatalign}
% \DescribeKey{textareatalign}'='<width>
% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the left side of the text area instead of centering it.
%
% \DescribeKey{textareainner}
% \DescribeKey{textareainner}'='<width>
% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the inner side of the text area instead of centering it.
% This assumes that the document is compiled in |twoside| mode.
% In |oneside| mode the macro is identical to \Key{pageleftalign}, i.e. always aligns to the left of the text area.
%
% \DescribeKey{textareaouter}
% \DescribeKey{textareaouter}'='<width>
% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the outer side of the text area instead of centering it.
% This assumes that the document is compiled in |twoside| mode.
% In |oneside| mode the macro is identical to \Key{pagerightalign}, i.e. always aligns to the right of the text area.
%
%
%
% \DescribeKey{noindent}
% This key will issue an \Macro\noindent for the \Macro\adjustbox to avoid a paragraph indention if it starts a paragraph.
% It does not expect a value and will ignore it if provided.
%
%
% \DescribeKey{leavevmode}
% This key will issue an \Macro\leavevmode for the \Macro\adjustbox to enter paragraph mode, i.e.\ it starts a paragraph.
% This is usually done automatically by all Keys, but is provided as a failsafe in case of any bugs.
%
%
% \DescribeMacro\centerbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{centerbox}[<width>]
% Macro and environment version of the \Key{center} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\leftalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{leftalignbox}[<width>]
% Macro and environment version of the \Key{left} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\rightalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{rightalignbox}[<width>]
% Macro and environment version of the \Key{rightalign} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\innersidebox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{innersidebox}[<width>]
% Macro and environment version of the \Key{inner} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\outersidebox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{outersidebox}[<width>]
% Macro and environment version of the \Key{outer} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\centerpagebox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{centerpagebox}[<width>]
% Macro and environment version of the \Key{centerpage} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
%
% \DescribeMacro\pagecenterbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{pagecenterbox}[<width>]
% Macro and environment version of the \Key{pagecenterbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\pageleftalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{pageleftalignbox}[<width>]
% Macro and environment version of the \Key{pageleftalignbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\pagerightalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{pagerightalignbox}[<width>]
% Macro and environment version of the \Key{pagerightalignbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\pageinnerbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{pageinnerbox}[<width>]
% Macro and environment version of the \Key{pageinnerbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\pageouterbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{pageouterbox}[<width>]
% Macro and environment version of the \Key{pageouterbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\textareacenterbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{textareacenterbox}[<width>]
% Macro and environment version of the \Key{textareacenterbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\textareatalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{textareatalignbox}[<width>]
% Macro and environment version of the \Key{textareatalignbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\textareatalignbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{textareatalignbox}[<width>]
% Macro and environment version of the \Key{textareatalignbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\textareainnerbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{textareainnerbox}[<width>]
% Macro and environment version of the \Key{textareainnerbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \DescribeMacro\textareaouterbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{textareaouterbox}[<width>]
% Macro and environment version of the \Key{textareaouterbox} key. The optional width argument defaults to \Macro\linewidth.
% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by
% placing a |\mbox{}| or the identical |\null| macro before it.
%
% \clearpage\subsection*{Lapping} ^^A (((3
% The following features can be used to make the content lap over its left or right boundary. This is basically the same
% as trimming, but provides a different, more dedicated interface.
%
%
% \DescribeKey{lap}'='<lap amount>
% \DescribeKey{lap}'='{<length>}{<lap amount>}
% This key will make the content lap over the surrounding elements to the right or left by the given amount..
% A positive amount will make the content lap over to the right
% and a negative one to the left. The optional \meta{length} argument allows to set the final width.
% If not used the resulting width will be the original width minus the absolute lap amount.
% This key internally uses \Macro\lapbox{<lap amount>}{\ldots} and \Macro\lapbox[<length>]{<lap amount>}{\ldots}, respectively.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{lap=.5\width}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{lap=-.5\width}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{lap=\width}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{lap=-\width}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{lap={\width}{\width}}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{lap={\width}{-\width}}{Some content}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{rlap}
% \DescribeKey{llap}
% \DescribeKey{clap}
% This makes the content to be officially 0pt wide and lap over to the right or left, respectively, like the \LaTeX\ macros \Macro\rlap, \Macro\llap and \Macro\clap do.
% These are shortcuts for \Key{lap}'='\AlsoMacro\width, \Key{lap}'=-'\AlsoMacro\width and \Key{lap}'={0pt}{-0.5'\AlsoMacro\width'}', respectively.
% The values for these keys are ignored and should not be used.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{rlap}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{llap}{Some content}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{clap}{Some content}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeMacro\lapbox[<width>]{<lap amount>}{<content>}
% This macro is a generalisation of the \LaTeX\ core macros \Macro\rlap{<content>} and \Macro\llap{<content>} which lap the
% text to the right or left without taking any official space. The \Macro\lapbox macro can be used to only partially lap
% the content to the right (positive amount) or left (negative amount). As with all macros of this package the original width
% can be references using \Macro\width. The resulting official width of the box is normally the original width minus the absolute
% lap amount. However, it can also be set explicitly using the option argument.
% It is also possible to use lap amount which absolute values are larger than the original width. In this case the resulting
% official width will be zero by default and the content will padded with the required white space.
% Note that the lap amount always states the distance between the right side of the official box and the right side of the actual
% content for positive amounts or the distance between the left side of the official box and the left side of the actual content
% for negative values.
%
% \begin{examples}
%   General lapping:
%   \begin{examplecode}
%   \lapbox{1cm}{Some Text}
%   \end{examplecode}
%   \vspace{-2\smallskipamount}%
%   \begin{examplecode}
%   \lapbox{-1cm}{Some Text}
%   \end{examplecode}
%   \vspace{-2\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[4cm]{1cm}{Some Text}
%   \end{examplecode}
%   \vspace{-2\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[3cm]{2cm}{Some Text}
%   \end{examplecode}
%   \vspace{\smallskipamount}%
%   Like \Macro\rlap:
%   \vspace{-\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[0pt]{\width}{Some Text}
%   \end{examplecode}
%   \vspace{\smallskipamount}%
%   Like \Macro\llap:
%   \vspace{-\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[0pt]{-\width}{Some Text}
%   \end{examplecode}
%   \vspace{\smallskipamount}%
%   A centering \Macro\clap macro can be achieved using:
%   \vspace{-\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[0pt]{-.5\width}{Some Text}
%   \end{examplecode}
%   \vspace{-2\smallskipamount}%
%   \begin{examplecode}
%   \lapbox[0pt]{.5\width}{Some Text}
%   \end{examplecode}
%
% \end{examples}
%
%
% ^^A )))3
% ^^A )))2
% \clearpage\subsection{Support for \pkg{graphicx} keys} ^^A (((2
%
% \DescribeKey{bbllx}'='<length>
% \DescribeKey{bblly}'='<length>
% \DescribeKey{bburx}'='<length>
% \DescribeKey{bbury}'='<length>
% \DescribeKey{decodearray}
% \DescribeKey{intent}
% \DescribeKey{interpolate}
% \DescribeKey{maskarray}
% \DescribeKey{natheight}'='<length>
% \DescribeKey{natwidth}'='<length>
% \DescribeKey{ocobjnum}
% \DescribeKey{ocobjref}
% \DescribeKey{page}'='<page numbers>
% \DescribeKey{pagebox}
% \DescribeKey{quiet}
% \DescribeKey{resetcolor}
% \DescribeKey{resolution}
% \DescribeKey{xmpfile}
% The above \pkg{graphicx} keys are also supported by \cs{adjustbox}. This is done by relying on the original
% \pkg{graphicx} code, i.e. the key code is copied into the \pkg{adjustbox} namespace. These keys are therefore
% mostly for use with images and might not work well with other content.
% For more details on these keys see the \pkg{graphicx} manual.
%
% ^^A )))2
% \clearpage\subsection{Colors} ^^A (((2
% \vspace{-\baselineskip}
%
% \DescribeKey{color}'='<color>
% \DescribeKey{color}'='{<model>}{<color>}
% This key sets the color for all material. Both the content and further material added by other keys will be affected.
% The color change is immediate and will occur before basically every other key takes effect.
% The order in which this key is used is therefore meaningless.
% Using this key several times will cause several color changes with the last one be used for the remaining material.
% Note that \Key{color} will not influence any \Key{fgcolor} or \Key{bgcolor} beside the fact that it changes the
% \emph{current color} accessible using the special name `|.|'.
%
% \DescribeKey{color*}'='<color macro>
% Like \Key{color} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors.
% See the \pkg{xcolor} manual for more details. A \Macro\blendcolors will affect both \Key{fgcolor} and \Key{bgcolor}.
%
%
% \DescribeKey{fgcolor}'='<color>
% \DescribeKey{fgcolor}'='{<model>}{<color>}
% This key sets the color for the content.
% The value is passed to an internal \Macro\color macro.
% This is done using \Key{innercode} because the color must be set before the content is boxed.
% Further material added using keys, e.g.\ a \Key{frame}, is not affected by this key.
% The \pkg{xcolor} package (or \pkg{color} or \pkg{xxcolor}) needs to be loaded otherwise an error will be raised.
%
% \DescribeKey{fgcolor*}'='<color macro>
% Like \Key{fgcolor} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors.
% See the \pkg{xcolor} manual for more details.
%
%
% \DescribeKey{bgcolor}'='<color>
% \DescribeKey{bgcolor}'='{<model>}{<color>}
% This key adds a colored background to the content. The \pkg{xcolor} package (or \pkg{color} or \pkg{xxcolor}) needs to be loaded
% as well in order for this to work. The value is passed to an internal \Macro\color macro.
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{bgcolor=blue}{Text with blue background.}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{bgcolor={rgb}{0 0 1}}{Text with blue background in the RGB color model.}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{margin=1ex,bgcolor=green}{green with a little more margin}
%   \end{examplecode}
%   \begin{examplecode}
%   \adjustbox{margin=1ex,bgcolor=green,margin=1pt,bgcolor=yellow}{Emulation of colored frame}
%   \end{examplecode}
% \end{examples}
%
% \DescribeKey{bgcolor*}'='<color macro>
% Like \Key{bgcolor} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors.
% See the \pkg{xcolor} manual for more details.
%
% \begin{examples}
%   \begin{examplecode}
%   \color{blue}Blue text
%   \adjustbox{bgcolor*=\blendcolors{!10!yellow}\color{.}}{with a yellow-bluish background}
%   \end{examplecode}
%   \begin{examplecode}
%   \color{green}Green text
%   \adjustbox{bgcolor*=\blendcolors{!10!yellow}\color{.}}{with a yellow-greenish background}
%   \end{examplecode}
% \end{examples}
%
% \DescribeMacro{\bgcolorbox}[<model>]{<color>}
% \DescribeMacro{\bgcolorbox}*{<color macro>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{bgcolorbox}[<model>]{<color>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{bgcolorbox*}{<color macro>}
% Standalone macro and environment versions of the \Key{bgcolorbox} and \Key{bgcolorbox*} keys.
%
%
%
% ^^A )))2
% \clearpage\subsection{Background and Forground Images and Text} ^^A (((2
% The following keys, macros and environment allow to add background and foreground layers.
% These layers are placed on the baseline of the original content and are horizontally centered, but can be adjusted
% using own \Macro\adjustbox or \Macro\includegraphics keys.
% The following dimension registers can be used to refer to the dimensions of the original content.
%
% \DescribeMacros
%    \hbox{\Macro\pwidth~~~\Macro\pheight~~~\Macro\pdepth~~~\Macro\ptotalheight}%
% \endDescribeMacros
% These dimension registers hold the width, height, depth and total height (height+depth) of the parent box and can be used
% to resize a background or foreground layer accordantly. They are only defined inside the key=value arguments of the
% following keys, macros and environments.
%
% \DescribeKey{bgimage}'='<image filename>
% \DescribeKey{bgimage}'='{<key=value pairs for image>}{<image filename>}
% Adds a background image to the content. The image is stretched if required to fit exactly to the content.
% It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the image (before the resizing is done).
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{bgimage=example-grid-100x100bp}{Some text}
%   \end{examplecode}
% \end{examples}
%
% \DescribeKey{bgimage*}'='<image filename>
% \DescribeKey{bgimage*}'='{<key=value pairs for image>}{<image filename>}
% Adds a background image to the content like \Key{bgimage} but the image is not stretched to fit the content.
% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys.
% The image is placed on the baseline of the content and horizontally centered. It can be lowered to the lower edge of
% the content using \Key{raise}'=-'\AlsoMacro\pdepth and left aligned using \Key{left}'='\AlsoMacro\pwidth etc.
%
% \DescribeMacro{\bgimagebox}[<key=value pairs>]{<image filename>}
% \DescribeMacro{\bgimagebox}*[<key=value pairs>]{<image filename>}
% \DescribeEnv[<content>]{bgimagebox}[<key=value pairs>]{<image filename>}
% \DescribeEnv[<content>]{bgimagebox*}[<key=value pairs>]{<image filename>}
% Standalone macro and environment versions of the \Key{bgimage} and \Key{bgimage*} keys.
%
%
% \DescribeKey{fgimage}'='<image filename>
% \DescribeKey{fgimage}'='{<key=value pairs for image>}{<image filename>}
% Adds a foreground image to the content. The image is stretched to fit exactly to the content.
% It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the image (before the resizing is done).
% The image is assumed to have transparent elements, otherwise the existing content is fully covered.
%
% \DescribeKey{fgimage*}'='<image filename>
% \DescribeKey{fgimage*}'='{<key=value pairs for image>}{<image filename>}
% Adds a foreground image to the content like \Key{fgimage} but the image is not stretched to fit the content.
% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys.
% The image is placed on the baseline of the content and horizontally centered.
%
% \DescribeMacro{\fgimagebox}[<key=value pairs>]{<image filename>}
% \DescribeMacro{\fgimagebox}*[<key=value pairs>]{<image filename>}
% \DescribeEnv[<content>]{fgimagebox}[<key=value pairs>]{<image filename>}
% \DescribeEnv[<content>]{fgimagebox*}[<key=value pairs>]{<image filename>}
% Standalone macro and environment versions of the \Key{fgimage} and \Key{fgimage*} keys.
%
%
%
% \DescribeKey{background}'='<background content>
% \DescribeKey{background}'='{<key=value pairs for image>}{<background content>}
% Adds the given content as background layer to the main content. The background content is stretched to fit the size of
% the main content.  It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the
% background content (before the resizing is done).
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{background={\color{red}xxx}}{Some text}
%   \end{examplecode}
% \end{examples}
%
% \DescribeKey{background*}'='<background content>
% \DescribeKey{background*}'='{<key=value pairs for image>}{<background content>}
% Like \Key{background} but does not resizes the background content.
% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys.
%
% \DescribeMacro{\backgroundbox}[<key=value pairs>]{<background content>}
% \DescribeMacro{\backgroundbox}*[<key=value pairs>]{<background content>}
% \DescribeEnv[<content>]{backgroundbox}[<key=value pairs>]{<background content>}
% \DescribeEnv[<content>]{backgroundbox*}[<key=value pairs>]{<background content>}
% Standalone macro and environment versions of the \Key{background} and \Key{background*} keys.
%
%
% \DescribeKey{foreground}'='<foreground content>
% \DescribeKey{foreground}'='{<key=value pairs for content>}{<foreground content>}
% Adds the given content as foreground layer to the main content. The foreground content is stretched to fit the size of
% the main content.  It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the
% foreground content (before the resizing is done).
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{foreground={\color{red}xxx}}{Some text}
%   \end{examplecode}
% \end{examples}
%
% \DescribeKey{foreground*}'='<foreground content>
% \DescribeKey{foreground*}'='{<key=value pairs for content>}{<foreground content>}
% Like \Key{foreground} but does not resizes the foreground content.
% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys.
%
% \DescribeMacro{\foregroundbox}[<key=value pairs>]{<foreground content>}
% \DescribeMacro{\foregroundbox}*[<key=value pairs>]{<foreground content>}
% \DescribeEnv[<content>]{foregroundbox}[<key=value pairs>]{<foreground content>}
% \DescribeEnv[<content>]{foregroundbox*}[<key=value pairs>]{<foreground content>}
% Standalone macro and environment versions of the \Key{foreground} and \Key{foreground*} keys.
%
%
%
% ^^A )))2
% \clearpage\subsection{Density / Pixel size} ^^A (((2
% The following keys allow to adjust the effective length of |pdftex| special |px| (pixel) unit.
% This can be required for images which do not have the correct DPI meta-data included.
%
%
% \DescribeKey{dpi}'='<number (dots per inch)>
% The \Key{dpi} key provides a simple interface to set the pixel size to the given DPI (dots per inch) value.
% For |pdflatex| the length unit |px| can be used to specify pixels. However, the equivalent dimension (length) of one pixel must be
% set using the \Macro\pdfpxdimen length register. To set a specific DPI value this length must be set using
% \Macro\setlength\AlsoMacro\pdfpxdimen{'1in/'<dots>}, which is done by the \Key{dpi}'='<dots> key.
% Note that the key won't affect the setting for the content but only for the further used keys.
% However, it is possible to use \Macro\setkeys{adjbox}{'dpi='<number>} inside the content or anywhere else in the document to
% set \Macro\pdfpxdimen using this interface.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{dpi=72,trim=10px,frame}{%
%       \setkeys{adjbox}{dpi=72}%
%       \textcolor{green}{\rule{50px}{50px}}%
%   }
%   \end{examplecode}
% \end{example}
%
% \DescribeKey{pxdim}'='<length>
% Alternatively
% to the \Key{dpi} key the \Macro\pdfpxdimen length can be set directly to the given value. Afterwards |1px| will stand
% for the given \meta{length}.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{pxdim=2pt,trim=2px,frame}
%       {\textcolor{green}{\rule{20pt}{20pt}}}
%   \end{examplecode}
% \end{example}
%
%
% ^^A )))2
% \clearpage\subsection{Minipage or other inner environments which change the processing of the content}\label{sec:inner} ^^A (((2
% The following keys set the way the content is processed before it is stored it in a box.
% These keys will overwrite each other and only the latest used key will take effect.
% Because they affect the inner content directly their order relative to other, normal keys is not meaningful.
% Also they are only defined for \env{adjustbox} but do not apply for \Macro\includegraphics.
% Because they are therefore only used inside a mandatory argument and never in an optional these keys allow for optional bracket arguments.
%
% \DescribeKey{minipage}'='<width>
% \DescribeKey{minipage}'='[<position>][<height>][<inner position>]{<width>}
% This key wraps the inner content in a \env{minipage} with the given \meta{width} before it is stored as horizontal box.
% Its order relative to other keys is not meaningful (except that future keys of this sub-section will overwrite it).
% This allows for line breaks and footnotes in the \env{adjustbox}.
% All optional arguments of \env{minipage} are supported. I only the width is given it does not have to be enclosed in braces.
% The \meta{position} argument must be "t" for top baseline, "b" for bottom baseline and "c" for center alignment relative to other
% text, i.e.\ defines the resulting baseline. If a \meta{height} is defined the \meta{inner position} defaults to \meta{position} but
% can also be "s" to stretch the content over the whole height. This requires the content to include some vertical stretchable material.
% Note that all length arguments can include arithmetic expressions like for other keys.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{minipage=5cm,angle=-10}{%
%      Some example code which will
%      be automatically broken or can include \\
%      line breaks\footnote{AND footnotes!!}\\
%      or verbatim \verb+@%^&}_+!%
%   }
%   \end{examplecode}
%   \begin{examplecode}
%   Before \begin{adjustbox}{minipage=[b][3cm][s]{5cm}}
%      Some example code
%
%      \vfill
%      with line breaks\footnote{AND footnotes!!}
%
%      \vfill
%      or verbatim \verb+@%^&}_+!%
%   \end{adjustbox} After
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{varwidth}'='<width>
% Adds a \env{varwidth} environment from the \pkg{varwidth} package around the content. This is similar to the
% \env{minipage} environment but the final width of the content will be as large as the widest line in the content up to
% the maximum amount given by the width argument.
% This environment key is vert useful if the content produces some paragraph material which can't be stored in an
% horizontal box directly.
%
%
% \DescribeKey{tabular}'='[<position>]{<column specification>}
% \DescribeKey{tabular*}'='[<position>]{<width>}{<column specification>}
% \DescribeKey{array}'='[<position>]{<column specification>}
% Places the content in a \env{tabular}, \env{tabular*} or \env{array} environment, respectively.
% These keys require different implementations for macro (\Macro\adjustbox) and environment mode (\env{adjustbox} environment) in order to insert
% the end code correctly. Note that the environment mode is more efficient and fully stable, while the macro mode requires the last row to end with
% an explicit |\\| (which can be followed by \Macro\hline or any other macro which uses \Macro\noalign internally). In macro mode the |\\| is internally redefined
% to check for the closing brace. While this was successful tested for normal usages it might still cause issues with unusual or complicated cases.
% Note that these environments are taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported.
%
% \begin{examples}
%   \begin{examplecode}
%   \adjustbox{tabular=lll}{%
%                   \hline
%       A & B & C \\\hline
%       a & b & c \\\hline
%   }
%   \end{examplecode}
%   \begin{examplecode}
%   \begin{adjustbox}{tabular=lll}
%       A & B & C \\
%       a & b & c
%   \end{adjustbox}
%   \end{examplecode}
% \end{examples}
%
%
% \DescribeKey{stack}
% \DescribeKey{stack}'='<horizontal alignment>
% \DescribeKey{stack}'='{<horizontal alignment>}{<vertical alignment>}
% \Descsep
% \DescribeMacro\stackbox!\optionaloff![<horizontal alignment>][<vertical alignment>]{<content>}
% \Descsep
% \DescribeEnv[<content>]{stackbox}[<horizontal alignment>][<vertical alignment>]
% The \Key{stack} key and its corresponding macro and environment can be used to stack multiple lines similar to the \Macro\shortstack macro, but
% both the horizontal and vertical alignment can be selected by a single letter each. Also a proper baseline skip is inserted.
% This is implemented using the \env{varwidth} environment which is based on the \env{minipage} environment.
% Its maximal width arguments is fixed internally to \Macro\linewidth.
%
% Possible horizontal alignments are: "l" (left), "r" (right), "c" (centered, default), "j" (justified).
% Possible vertical alignments are the same as for \env{minipage}: "t" (top baseline), "b" (bottom baseline, default), "c" (vertical centered).
% Because these arguments are always single letters the "{ }" around them can be skipped, so that the value can simple be two concatenated letters.
%
% \begin{example}
%   \begin{examplecode}
%   .\adjustbox{stack}{A\\B\\CC}.
%   \end{examplecode}
%   \begin{examplecode}
%   .\adjustbox{stack=r}{A\\B\\CC}.
%   \end{examplecode}
%   \begin{examplecode}
%   .\adjustbox{stack=ct}{A\\B\\CC}.
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{innerenv}'='<environment name>
% \DescribeKey{innerenv}'='{<environment name>}<environment options>
% Wraps the inner content in the given \meta{environment} before it is stored as horizontal box.
% It should be kept in mind that there is some internal code between the begin of the environment and the content. For this reason
% a \env{tabular}, \env{array} or similar environment will not work here, because that code will be taken as part of the first cell.
% Note that such a environment is taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported.
%
% \begin{example}
%   \begin{examplecode}
%   \newenvironment{myenv}[2][]{Before [#1](#2)}{After}
%   \adjustbox{innerenv={myenv}[ex]{amble}}{Content}
%   \end{examplecode}
%   \newenvironment{myenv}[2][]{Before [#1](#2)}{After}
%   \begin{examplecode}
%   \adjustbox{innerenv={myenv}{amble}}{Content}
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{innercode}'='{<begin code>}{<end code>}
% Places the given code before and after the inner content before it is stored as horizontal box.
% Note that such code is taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported.
%
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{innercode={\color{green}}{!}}{Content}
%   \end{examplecode}
% \end{example}
%
% ^^A )))2
% \clearpage\subsection{Floats and non-float replacements} ^^A (((2
% The following keys can be used to turn an adjusted box into a float or a non-floating replacement which also allows
% for a caption. These keys must be used last and no other normal keys must be used afterwards, otherwise an error will
% occur because the added floating environment is boxed again.
%
%
% \DescribeKey{caption}=<caption text>
% \DescribeKey{caption}=[<short caption>]{<long caption>}
% Defines a caption which will be used by a following \Key{figure}, \Key{float} or \Key{nofloat} key.
% The position of the caption defaults to top for a |table| (non-)float and bottom for every other type.
%
% \DescribeKey{captionabove}=<caption text>
% \DescribeKey{captionabove}=[<short caption>]{<long caption>}
% Like the \Key{caption} key but forces the placement of the caption above the content.
% The vertical skip above and below a normal below caption are reversed in this case to get proper
% spacing. However, this is not done if the \pkg{caption} package is loaded.
% It is recommended to load this package with the |tableposition=above| option.
%
%
% \DescribeKey{captionbelow}=<caption text>
% \DescribeKey{captionbelow}=[<short caption>]{<long caption>}
% Like the \Key{caption} key but forces the placement of the caption below the content.
%
%
% \DescribeKey{label}=<label>
% Defines a label which will be used by a following \Key{figure}, \Key{float} or \Key{nofloat} key.
%
%
% \DescribeKey{figure}
% \DescribeKey{figure}=<placement>
% Turns the adjusted box into a \env{figure}.
% A previously used \Key{caption} and \Key{label} will be added.
% This is a specialised version of \Key{float}={figure}.
%
%
% \DescribeKey{float}=<float type>
% \DescribeKey{float}={<float type>}[<position>]
% Turns the adjusted box into a float of the given type, i.e.\ |figure|, |table| or any other custom defined float.
% A previously used \Key{caption} and \Key{label} will be added.
%
%
% \DescribeKey{nofloat}=<float type>
% This will add a non-floating replacement of the given float type (|figure|, |table|, etc.).
% The will place the content always at the current
% position which can lead to bad page-breaking. A caption will be in the same format as for real floats of the same
% type.
% A previously used \Key{caption} and \Key{label} will be added.
%
% \DescribeEnv[<content>]{adjnofloat}{<float type>}
% This environment is used internally by \Key{nofloat} to create a non-floating replacement of the given float type
% (|figure|, |table|, etc.). It can also be used directly with other code or be redefined to change the
% behavior of \Key{nofloat}.
% Any redefinition should include |\adjbox@nofloatcaptionsetup{#1}| to set the caption type.
% The environment will be used in plain form, i.e.\ \Macro\adjnofloat\ldots\Macro\endadjnofloat, so
% if a group is required in a redefinition it should be added manually using \Macro\begingroup and \Macro\endgroup.
%
%
%
% ^^A )))2
% \Needspace*{8\baselineskip}
% \clearpage\subsection{Adding own Code or Environments} ^^A (((2
% \vspace{-\baselineskip}
%
% \DescribeKey{env}'='<environment name>
% \DescribeKey{env}'='{<environment name>}<environment options>
% Adds an \meta{environment} around the content and the already existing code around it which was added by other keys beforehand.
% Potential \meta{environment options} (or any other code) can follow the environment name if it was set inside braces.
% At this stage the content is already boxed and format macros won't have any effect on any included text. For this the \Key{innerenv} key needs to be used instead.
%
% \DescribeKey{addcode}'='{<code before>}{<code afters>}
% Adds some \meta{code before} and some \meta{code after} the content and the
% already existing code around it which was added by other keys beforehand.
% At this stage the content is already boxed and format macros won't have any effect on any included text.
% This key sets
% the size of the content before adding the code, i.e.\ keys like \Key{width} or \Key{scale} are executed on the content
% beforehand.
%
% \DescribeKey{Addcode}'='{<code before>}{<code afters>}
% Identical to \Key{addcode} but does not sets the size of the content first.
%
% \DescribeKey{appcode}'='<code afterwards>
% Appends the given \LaTeX\ code after the currently accumulated content. Note that this is the original content of the adjusted box \emph{and} all code
% added by the previous keys.
%
% It is recommended to wrap complex code into braces.
%
% \DescribeKey{precode}'='<code before>
% Prepends the given \LaTeX\ code before the currently accumulated content. Note that this is the original content of the adjusted box \emph{and} all code
% added by the previous keys. The content is wrapped into curly braces, so the given code can use it as a macro argument.
% This key sets the size of the content before adding the code, i.e.\ keys like \Key{width} or \Key{scale} are executed on the content
% beforehand.
%
% It is recommended to wrap complex code into braces.
%
%
% \DescribeKey{Precode}'='{<code before>}
% Identical to \Key{precode} but does not sets the size of the content first.
%
%
% \DescribeKey{execute}'='<code>
% Simply executes the code immediately. This is done in the key processing phase and is intended mostly for debugging purposes.
% Previous (normal) keys won't have an effect yet.
%
% \DescribeKey{Execute}'='<code>
% Simply executes the code immediately. This is done in the key processing phase for inner environments (see \autoref{sec:inner}) and is intended mostly for debugging purposes.
% Only previously used special keys for modifying the boxing of the content will have an effect yet.  % All other keys are not yet processed.
%
%
% ^^A )))2
% \clearpage\subsection{Change or discard content} ^^A (((2
% \vspace{-\baselineskip}
%
% \DescribeKey{phantom}
% \DescribeKey{phantom}'=h'
% \DescribeKey{phantom}'=v'
% This key replaces the content with an empty phantom box of the same dimension.
% If the "h" or "v" value is used the box will only have the same horizontal size or vertical sizes (height and depth)
% while using zero for the other dimension(s). For this the standard \LaTeX\ macros \Macro\phantom, \Macro\hphantom and
% \Macro\vphantom are used internally.
%
%
% \DescribeMacro\phantombox{<width>}{<height>}{<depth>}
% This macro produces an empty box with the given width, height and depth.
% It is equivalent to \Macro\phantom{\AlsoMacro\rule['-'<depth>]{<width>}{<height>'+'<depth>}} but more efficient and more user friendly.
%
% \begin{example}
%   \begin{examplecode}
%   Before \fbox{\phantombox{1cm}{2ex}{1ex}} After
%   \end{examplecode}
% \end{example}
%
%
% \DescribeKey{gobble}
% \DescribeKey{discard}
% These two keys are aliases and will discard the content after it was fully processed.  Any keys used after one of this
% keys will operate on an empty content.  These keys can be used in combination of the \Key{gstore ...} keys to only
% measure but not typeset some content.
%
% \DescribeKey{content}'='<new content>
% This key discards the current content completely after it was fully processed and all earlier keys were applied
% and sets the content to the given \meta{new content}. This can be used to implement some draft box or censoring
% features.
%
% \newlength\somelengtha
% \newlength\somelengthb
% \begin{example}
%   \begin{examplecode}
%   \adjustbox{frame,rotate=-30,gstore sizes=\somelengtha{}{}\somelengthb,
%       content={Censored!},rotate=30,totalheight=\somelengtha,width=\somelengthb,frame}
%           {The real content}
%   \end{examplecode}
% \end{example}
%
%
%
% ^^A )))2
% \clearpage\subsection{Store box content } ^^A (((2
%
% \DescribeKey{gstore}'='<\textbackslash boxregister>
% \DescribeKey{gstore*}'='<\textbackslash boxregister>
% These keys globally store the current content into the given box register.
% With the normal version the content is still preserved and can be further adjusted.
% With the starred version the content will be consumed and further keys will be applied to an empty content.
%
% \DescribeKey{gstore width}'='<\textbackslash lengthregister>
% \DescribeKey{gstore height}'='<\textbackslash lengthregister>
% \DescribeKey{gstore depth}'='<\textbackslash lengthregister>
% \DescribeKey{gstore totalheight}'='<\textbackslash lengthregister>
% These key globally store the width, height, depth and totalheight into a length register, respectively.
% The content will not be altered by these keys. There are no starred versions like for \Key{gstore}.
% If the content should only be measured but not typeset the \Key{gobble}/\Key{discard} key can be used afterwards.
%
% \DescribeKey{gstore sizes}'='<\textbackslash lengthregister><\textbackslash lengthregister><\textbackslash lengthregister><\textbackslash lengthregister>
% Stores all four size values (width, height, depth and totalheight) of the content in the given length registers.
% This key should be used if more than one dimension should be stored, because it is much more efficient than using
% multiple of the above keys.
% If a dimension is not required it can be replaced by an empty argument, i.e.\ `|{}|'.
% Trailing dimensions can be skipped altogether if they are not required.
%
%
% ^^A )))2
% \clearpage\subsection{Process content} ^^A (((2
%
% \DescribeKey{process}
% This key processes the keys and content encountered so far (i.e.\ all keys to its left) and sets the dimension macros to the sizes of the result.
% It is only required for certain key combinations, mostly the ones taken from \pkg{graphicx}, which are otherwise processed together.
%
% ^^A )))2
% \clearpage\subsection{Experimental Keys} ^^A (((2
% The following features are experimental and may not work correctly yet.
% At the moment the \pkg{storebox} package must be loaded manually for this keys.
%
% \DescribeMacro\splitbox{<split width>}{<split height>}{<content>}
% This macro boxes the given content and splits it in multiple fragments of the given width and height.
% This is done row by row starting from the upper left corner. The last column and row can have a smaller size than requested.
% Every fragment is placed using \Macro\splitboxcmd{<fragment box>} which is empty by default but can be redefined to e.g.\ draw
% a frame around each fragment. After every row except the last the macro \Macro\splitboxnewline is inserted which defaults to |\\|,
% but can also be redefined freely. After the last row the macro \Macro\splitboxlastnewline is inserted which defaults to \Macro\splitboxnewline.
%
% The \Macro\splitbox content is stored using \Macro\storebox from the \pkg{storebox} package and therefore the whole content should only
% be stored once in the output file if the format is supported by that package (currently only PDF).
%
% \DescribeEnv[<content>]{splitbox}{<split width>}{<split height>}
% Environment version of \Macro\splitbox.
%
% \DescribeKey{split}'='{<split width>}{<split height>}
% The \Key{split} key can be used with \Macro\adjustbox and uses \Macro\splitbox internally.
%
% \DescribeMacro\pagebreakbox{<content>}
% The \Macro\pagebreakbox macro will split the content into multiple parts so that if fits on the current page.
% If it is larger than the rest of the current page and the full next page it is broken again until the last part fits on a page.
% This doesn't take any baselines into account and text line in the content may be split in two.
% This might be compensated manually by redefining the \Macro\pagebreakboxoffset macro (default: `|\ht\strutbox|'), which adjust the vertical offset
% of the first part.
%
% \DescribeEnv{pagebreakbox}
% Environment version of \Macro\pagebreakbox.
%
% \DescribeKey{pagebreak}
% The key version of \Macro\pagebreakbox. There should no be any further keys used afterwards, because they will interfere with the page breaks.
%
%
% ^^A )))2
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Defining own Keys} ^^A (((
% The following macros can be used to define own keys or redefine existing ones.
%
% \DescribeMacro\newadjustboxkey{<key>}[<default value>]{<code>}
% \DescribeMacro\newadjustboxkey*{<key>}[<default value>]{<code>}
% Defines the new \env{adjustbox} key with the given default value if no value is provided.
% The value can be accessed inside the code as |#1|
% Without a default value an error is raised if the value is missing.
% An error is raised if the key is already defined.
%
% The normal form will add the code to the internal token register just before the previous content which is
% wrapped inside braces: \MacroArgs<code>{<previous content>}. Subsequent keys will receive this as content.
% The code can therefore read the content as macro argument. If the dimension of the content need to be accessed
% it should be boxed first using \Macro\collectbox{<code>}. Then the dimension are available using the usual
% macros and the content can be typeset using \Macro\BOXCONTENT. See the \pkg{collectbox} for additional information.
%
% The starred form simply executes the given code in the internal group without changing the token register.
% In this case the content is not directly accessible and all subsequent keys are not yet processed.
% This form is useful to locally change settings for the current \Macro\adjustbox macro or \env{adjustbox} environment.
%
%
% \DescribeMacro\renewadjustboxkey{<key>}[<default value>]{<code>}
% \DescribeMacro\renewadjustboxkey*{<key>}[<default value>]{<code>}
% Like \Macro\newadjustboxkey but will redefine an existing key.
% An error is raised if the key is not already defined.
%
%
% \DescribeMacro\provideadjustboxkey{<key>}[<default value>]{<code>}
% \DescribeMacro\provideadjustboxkey*{<key>}[<default value>]{<code>}
% Like \Macro\newadjustboxkey but will define the key only if it is not already defined.
%
%
% \DescribeMacro\defadjustboxkey{<key>}[<default value>]{<code>}
% \DescribeMacro\defadjustboxkey*{<key>}[<default value>]{<code>}
% Like \Macro\newadjustboxkey but will always define the key independent if it is already defined or not.
%
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \StopEventually{}
% \clearpage% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \clearpage\section{Implementation} ^^A (((
% \setcounter{lstnumber}{1}
%
% \iffalse
%<*adjustbox.sty>
% \fi
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Package header, options and dependencies} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    \begin{macrocode}
%<!COPYRIGHT>
\ProvidesPackage{adjustbox}[%
%<!DATE>
%<!VERSION>
%<*DRIVER>
    2099/01/01 develop
%</DRIVER>
    Adjusting TeX boxes (trim, clip, ...)]
%    \end{macrocode}
%
% Load the packages required for the options.
%    \begin{macrocode}
\RequirePackage{xkeyval}
\RequirePackage{adjcalc}
%    \end{macrocode}
%
% Declare normal options.
%    \begin{macrocode}
\def\adjbox@fam{adjbox}
\DeclareOptionX<Adjbox>{export}{\def\adjbox@fam{Gin}}
\DeclareOptionX<Adjbox>{Export}{\AtEndOfPackage{\let\includegraphics\adjincludegraphics}}
\DeclareOptionX<Adjbox>{patch}{%
    \PackageWarning{adjustbox}{%
         The 'patch' option is now deprecated.\MessageBreak
         Use the new \string\adjustimage\space or \string\adjincludegraphics\space macros instead%
         \@gobble
    }%
}
\DeclareOptionX<Adjbox>{minimal}{\let\adjustbox@minimal\endinput}
%    \end{macrocode}
%
% Declare the options which must be passed to \pkg{adjcalc} in a special form,
% because they require extra packages. This must be this way because \pkg{adjcalc}
% is already loaded.
%    \begin{macrocode}
\DeclareOptionX<Adjbox>{pgfmath}{\AtEndOfPackage{\RequirePackage{pgf}\adjcalcset{pgfmath}}}
\DeclareOptionX<Adjbox>{calc}{\AtEndOfPackage{\RequirePackage{calc}\adjcalcset{calc}}}
\DeclareOptionX<Adjbox>{etex}{\AtEndOfPackage{\adjcalcset{etex}}}
\DeclareOptionX<Adjbox>{defaultunit}{\AtEndOfPackage{\adjcalcset{defaultunit={#1}}}}
%    \end{macrocode}
%
% Handle the special \opt{pgf} and \opt{PGF} options.
%    \begin{macrocode}
\DeclareOptionX<Adjbox>{pgf}{\PassOptionsToPackage{pgf}{trimclip}}
\DeclareOptionX<Adjbox>{PGF}{\PassOptionsToPackage{pgf}{trimclip}\AtEndOfPackage{\RequirePackage{pgf}\adjcalcset{pgfmath}}}
%    \end{macrocode}
%
% Pass |pkg{graphicx}| options down.
%    \begin{macrocode}
\DeclareOptionX<Adjbox>{draft}{\PassOptionsToPackage{draft}{graphicx}}
\DeclareOptionX<Adjbox>{final}{\PassOptionsToPackage{final}{graphicx}}
\DeclareOptionX<Adjbox>{hiderotate}{\PassOptionsToPackage{hiderotate}{graphicx}}
\DeclareOptionX<Adjbox>{hidescale}{\PassOptionsToPackage{hidescale}{graphicx}}
\DeclareOptionX<Adjbox>{hiresbb}{\PassOptionsToPackage{hiresbb}{graphicx}}
\DeclareOptionX<Adjbox>{demo}{\PassOptionsToPackage{demo}{graphicx}}
%    \end{macrocode}
%
% Pass all driver options to \pkg{trimclip} and all unknown options to \pkg{graphicx}.
%    \begin{macrocode}
\DeclareOptionX*{%
    \IfFileExists{tc-\CurrentOption.def}{%
        \PassOptionsToPackage\CurrentOption{trimclip}%
    }{%
        \PassOptionsToPackage\CurrentOption{graphicx}%
    }%
}
%    \end{macrocode}
%
% Process all options.
%    \begin{macrocode}
\ProcessOptionsX*<Adjbox>\relax
%    \end{macrocode}
%
% Load the required packages.
%    \begin{macrocode}
\RequirePackage{trimclip}
\RequirePackage{graphicx}[1999/02/16]
\RequirePackage{collectbox}[2012/05/17]
%    \end{macrocode}
%
% Fall-back code for older \pkg{collectbox} versions:
%    \begin{macrocode}
\@ifpackagelater{collectbox}{2012/05/17}{}{%
    \let\@Collectbox\@collectbox
}
%    \end{macrocode}
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Basic commands} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\adjustboxset}
%    \begin{macrocode}
\newcommand*\adjustboxset{%
    \@ifstar
        {\adjbox@addkeysafter}%
        {\adjbox@addkeysbefore}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@addkeysbefore}[1]{<keys>}
%    \begin{macrocode}
\def\adjbox@addkeysbefore#1{%
    \ifx\@nnil#1\@nnil
        \let\adjbox@keysbefore\@empty
    \else
        \expandafter\def\expandafter\adjbox@keysbefore\expandafter{\adjbox@keysbefore,#1}%
        \let\adjbox@setkeys\adjbox@setkeys@ba
    \fi
}
\let\adjbox@keysbefore\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@addkeysafter}[1]{<keys>}
%    \begin{macrocode}
\def\adjbox@addkeysafter#1{%
    \begingroup
    \def\@tempa{#1}%
    \ifx\@tempa\@empty
        \endgroup
        \let\adjbox@keysafter\@empty
    \else
        \expandafter\expandafter
        \expandafter\endgroup
        \expandafter\expandafter
        \expandafter\def
        \expandafter\expandafter
        \expandafter\adjbox@keysafter
        \expandafter\expandafter
        \expandafter{\expandafter\@tempa\expandafter,\adjbox@keysafter}%
        \let\adjbox@setkeys\adjbox@setkeys@ba
    \fi
}
\let\adjbox@keysafter\@empty
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\adjustbox}[1]{<keys>}
% Now processes the keys before the box is read to allow for parbox or similar modes.
%
% This code was originally adapted from the \Macro\Gin@ii macro from the |graphicx| package.
% The \emph{temp switch a} is set to |true| to indicate to |graphicx| that the
% scaling should be done internal, so this package doesn't have to do it.
% The content including macro \Macro\adjustbox@content is but into place,
% the saved options are activated and the final size is set.
% The typesetting of the content is finally done by executing the token register.
%    \begin{macrocode}
\newcommand\adjustbox{%
    \begingroup
    \collectboxcheckenv{adjustbox}%
    \@adjustbox
}
\long\def\@adjustbox#1{%
    \edef\adjbox@line{\the\inputlineno}%
    \let\collectbox@mode\relax
    \let\collectbox@noindent\relax
    \let\adjbox@collectbox\@collectbox
    \let\adjbox@begininnercode\@empty
    \let\adjbox@endinnercode\@empty
    \chardef\adjbox@innerlevel\z@
    \ifcollectboxenv
        \let\adjustbox@noindent\noindent
        \let\adjustbox@unskip\unskip
        \let\adjustbox@ignorespaces\ignorespaces
    \else
        \let\adjustbox@noindent\relax
        \let\adjustbox@unskip\relax
        \let\adjustbox@ignorespaces\relax
    \fi
    \let\XKV@checksanitizea\adjbox@kvsanitize
    \adjbox@setkeys{#1}%
    \expandafter
    \adjbox@collectbox\expandafter{\expandafter\adjustbox@\expandafter{\XKV@rm}}%
}
\def\adjbox@setkeys@ba{%
    \expandafter\expandafter
    \expandafter\adjbox@@setkeys@ba
    \expandafter\expandafter
    \expandafter{\expandafter\adjbox@keysbefore\expandafter}%
    \expandafter{\adjbox@keysafter}%
}
\def\adjbox@@setkeys@ba#1#2#3{%
    \setkeys*{ADJBOX}{#1,#3,#2}%
}
\def\adjbox@setkeys{%
    \setkeys*{ADJBOX}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjustbox@}[1]{<keys>}
% Second part of \Macro\adjustbox, after the content has been boxed.
% This sets the dimension macros, processes the keys and finally typesets the content.
%    \begin{macrocode}
\def\adjustbox@#1{%
    \adjbox@Width\width
    \adjbox@Height\height
    \adjbox@Depth\depth
    \adjbox@Totalheight\totalheight
    \let\Width\adjbox@Width
    \let\Height\adjbox@Height
    \let\Depth\adjbox@Depth
    \let\Totalheight\adjbox@Totalheight
    \let\Gin@esetsize\adjbox@esetsize
    \let\@collectbox\@Collectbox
    \@tempswatrue
    \toks@{{\adjustbox@content}}%
    \def\setlength{\adjsetlength}%
    \setkeys{adjbox,Gin,adjcalc}{#1}%
    \adjbox@esetsize
    \adjustbox@noindent
    \the\toks@
    \endgroup
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\begingroup
\catcode`\, 3
\catcode`\= 3
\gdef\adjbox@comma@iii{,}%
\gdef\adjbox@equal@iii{=}%
\catcode`\, 4
\catcode`\= 4
\gdef\adjbox@comma@iv{,}%
\gdef\adjbox@equal@iv{=}%
\catcode`\, 7
\catcode`\= 7
\gdef\adjbox@comma@vii{,}%
\gdef\adjbox@equal@vii{=}%
\catcode`\, 8
\catcode`\= 8
\gdef\adjbox@comma@viii{,}%
\gdef\adjbox@equal@viii{=}%
\catcode`\, 10
\catcode`\= 10
\gdef\adjbox@comma@x{,}%
\gdef\adjbox@equal@x{=}%
\catcode`\, 11
\catcode`\= 11
\gdef\adjbox@comma@xi{,}%
\gdef\adjbox@equal@xi{=}%
\catcode`\, 13
\catcode`\= 13
\gdef\adjbox@comma@xiii{,}%
\gdef\adjbox@equal@xiii{=}%
\catcode`\, 12
\catcode`\= 12
\gdef\adjbox@comma@xii{,}%
\gdef\adjbox@equal@xii{=}%
%    \end{macrocode}
%
% \begin{macro}{\adjbox@kvsanitize}
%    \begin{macrocode}
\gdef\adjbox@kvsanitize#1#2{%
    \def\@tempa{\expandafter\noexpand\adjbox@comma@xiii}%
    \def\@tempb{}%
    \ifnum\catcode`\,=12 \else
        \ifnum\catcode`\,=13 \else
            \@ifundefined{adjbox@comma@\romannumeral\catcode`\,}{%
                \PackageError{adjustbox}
                {Invalid comma catcode \the\catcode`\,}{}%
            }{}%
            \edef\@tempb{\csname adjbox@comma@\romannumeral\the\catcode`\,\endcsname}%
        \fi
    \fi
    \edef\@tempa{\@tempa\@tempb}%
    \XKV@tempa@toks{#1}%
    \expandafter\adjbox@replacecatcodes\expandafter,\@tempa\@nnil
    \def\@tempa{\expandafter\noexpand\adjbox@equal@xiii}%
    \def\@tempb{}%
    \ifnum\catcode`\==12 \else
        \ifnum\catcode`\==13 \else
            \@ifundefined{adjbox@equal@\romannumeral\catcode`\=}{%
                \PackageError{adjustbox}
                {Invalid equal sign catcode \the\catcode`\=}{}%
            }{}%
            \def\@tempb{\@tempa\csname adjbox@equal@\romannumeral\the\catcode`\,\endcsname}%
        \fi
    \fi
    \edef\@tempa{\@tempa\@tempb}%
    \expandafter\adjbox@replacecatcodes\expandafter=\@tempa\@nnil
    \edef#2{\the\XKV@tempa@toks}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@replacecatcodes}
%    \begin{macrocode}
\gdef\adjbox@replacecatcodes#1#2{%
    \ifx\@nnil#2\relax\else
        \def\@tempa##1#2{%
            \ifx\@nnil##1\relax\else
                \XKV@tempa@toks{##1}%
                \expandafter\@tempb
            \fi
        }%
        \def\@tempb##1#2{%
            \ifx\@nnil##1\relax\else
                \XKV@tempa@toks\expandafter{\the\XKV@tempa@toks#1##1}%
                \expandafter\@tempb
            \fi
        }%
        \expandafter\@tempa\the\XKV@tempa@toks#2\@nnil#2\relax
        \expandafter\adjbox@replacecatcodes\expandafter#1%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\endgroup
%    \end{macrocode}
%
%
% \begin{macro}{\adjustbox@content}
% The default content, which is simply the collected box.
% This macro can be redefined if required.
%    \begin{macrocode}
\def\adjustbox@content{%
    \usebox\collectedbox
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\smallestside}
%    \begin{macrocode}
\def\smallestside{\ifdim\width<\totalheight \width\else\totalheight\fi}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\largestside}
%    \begin{macrocode}
\def\largestside{\ifdim\width>\totalheight \width\else\totalheight\fi}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Smallestside}
%    \begin{macrocode}
\def\Smallestside{\ifdim\Width<\Totalheight \Width\else\Totalheight\fi}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Largestside}
%    \begin{macrocode}
\def\Largestside{\ifdim\Width>\Totalheight \Width\else\Totalheight\fi}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@Width}
% \begin{macro}{\adjbox@Height}
% \begin{macro}{\adjbox@Depth}
% \begin{macro}{\adjbox@Totalheight}
% Dimension registers for original sizes.
%    \begin{macrocode}
\newdimen\adjbox@Width
\newdimen\adjbox@Height
\newdimen\adjbox@Depth
\newdimen\adjbox@Totalheight
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\adjbox@pwidth}
% \begin{macro}{\adjbox@pheight}
% \begin{macro}{\adjbox@pdepth}
% \begin{macro}{\adjbox@ptotalheight}
% Dimension registers for parent sizes; used for keys which use an internal adjustbox.
%    \begin{macrocode}
\newdimen\adjbox@pwidth
\newdimen\adjbox@pheight
\newdimen\adjbox@pdepth
\newdimen\adjbox@ptotalheight
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\adjbox@parentdims}
%    \begin{macrocode}
\def\adjbox@parentdims{%
    \let\pwidth\adjbox@pwidth
    \let\pheight\adjbox@pheight
    \let\pdepth\adjbox@pdepth
    \let\ptotalheight\adjbox@ptotalheight
    \pwidth\width
    \pheight\height
    \pdepth\depth
    \ptotalheight\totalheight
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@esetsize}
% Replacement of \Macro\Gin@esetsize.
% Now always called in external mode. Checks if any size is set and, as an optimation, does nothing otherwise.
%
% OLD:
% When called in \emph{external} mode (switch is true) then the content is wrapped in
% the internal form of \Macro\resizebox. In \emph{internal} mode, i.e.\ resizing is done by the graphic driver,
% the same code is added around the inner macro. This ensures the same behaviour as \Macro\includegraphics.
%    \begin{macrocode}
\def\adjbox@esetsize{%
  \ifcase0%
    \ifx\Gin@ewidth\Gin@exclamation\else 1\fi
    \ifx\Gin@eheight\Gin@exclamation\else 1\fi
  \relax
  \else
    \edef\@tempa{\toks@{\noexpand
                \Gscale@@box\noexpand\Gin@eresize
                {\Gin@ewidth}{\Gin@eheight}{\the\toks@}}}%
    \@tempa
    \let\Gin@ewidth\Gin@exclamation
    \let\Gin@eheight\Gin@exclamation
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjustimage}
% Simple wrapper to use \Macro\adjustbox for images.
% It uses the internal code of \Macro\includegraphics instead
% to allow later redefinition of that macro.
%    \begin{macrocode}
\newcommand*\adjustimage[2]{%
    \adjustbox{#1}{\Gin@clipfalse\Gin@i{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjincludegraphics}[2]{<keys>}{<filename>}
% Simple wrapper to use \Macro\adjustbox for images in the same format of \Macro\includegraphics.
% This allows to simply do |\let\includegraphics\adjincludegraphics|, which is done by the \opt{Export} option.
%    \begin{macrocode}
\newcommand*\adjincludegraphics[2][]{%
    \adjustbox{#1}{\Gin@clipfalse\Gin@i{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% End input of file if the \opt{minimal} option was used.
%    \begin{macrocode}
{\csname adjustbox@minimal\endcsname}
%    \end{macrocode}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Macros to define new adjustbox environments/macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\newadjustboxenv}
%    \begin{macrocode}
\newcommand*\newadjustboxenv{%
    \begingroup
    \@ifstar{%
        \let\@@@newadjustboxenv\@@@newadjustboxenv@
        \def\new@adjustbox{\newenvironment}%
        \newadjustboxenv@
    }{%
        \def\new@adjustbox{\newcommand}%
        \newadjustboxenv@
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\renewadjustboxenv}
%    \begin{macrocode}
\newcommand*\renewadjustboxenv{%
    \begingroup
    \@ifstar{%
        \let\@@@newadjustboxenv\@@@newadjustboxenv@
        \def\new@adjustbox{\renewenvironment}%
        \newadjustboxenv@
    }{%
        \def\new@adjustbox{\renewcommand}%
        \newadjustboxenv@
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\provideadjustboxenv}
%    \begin{macrocode}
\newcommand*\provideadjustboxenv{%
    \begingroup
    \@ifstar{%
        \let\@@@newadjustboxenv\@@@newadjustboxenv@
        \def\new@adjustbox{\@star@or@long\adjustbox@provideenvironment}%
        \newadjustboxenv@
    }{%
        \def\new@adjustbox{\providecommand}%
        \newadjustboxenv@
    }%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\declareadjustboxenv}
%    \begin{macrocode}
\newcommand*\declareadjustboxenv{%
    \begingroup
    \@ifstar{%
        \let\@@@newadjustboxenv\@@@newadjustboxenv@
        \def\new@adjustbox##1{%
            \expandafter\let\csname ##1\endcsname\@undefined
            \newenvironment{##1}%
        }%
        \newadjustboxenv@
    }{%
        \def\new@adjustbox##1{%
            \let##1\@undefined
            \newcommand{##1}%
        }%
        \newadjustboxenv@
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\newadjustboxcmd}
%    \begin{macrocode}
\newcommand*\newadjustboxcmd{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustboxcmd
    \def\new@adjustbox{\newcommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\renewadjustboxcmd}
%    \begin{macrocode}
\newcommand*\renewadjustboxcmd{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustboxcmd
    \def\new@adjustbox{\renewcommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\provideadjustboxcmd}
%    \begin{macrocode}
\newcommand*\provideadjustboxcmd{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustboxcmd
    \def\new@adjustbox{\providecommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\provideadjustboxcmd}
%    \begin{macrocode}
\newcommand*\declareadjustboxcmd{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustboxcmd
    \def\new@adjustbox##1{\let##1\@undefined\newcommand{##1}}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\adjustbox@provideenvironment}[1]{<environment name>}
% Tests if the environment already exists and calls the internal
% macro of \Macro\newenvironment if not. Otherwise, the two optional
% and two mandatory arguments are gobbled.
%    \begin{macrocode}
\def\adjustbox@provideenvironment#1{%
    \@ifundefined{#1}%
        {\new@environment{#1}}%
        {\adjustbox@gobble@oomm}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjustbox@gobble@oomm}
% Gobbles the first optional argument.
%    \begin{macrocode}
\newcommand*\adjustbox@gobble@oomm[1][]{%
    \adjustbox@gobble@@oomm
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjustbox@gobble@@oomm}
% Gobbles the second optional and two mandatory arguments.
%    \begin{macrocode}
\newcommand*\adjustbox@gobble@@oomm[3][]{%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\newadjustboxenv@}[1]{<environment name>}
%    \begin{macrocode}
\def\newadjustboxenv@#1{%
    \@ifnextchar{[}%
        {\@newadjustboxenv{#1}}%
        {\@@@newadjustboxenv{#1}{[0]}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@newadjustboxenv}[2]{<environment name>}{<optional argument>}
%    \begin{macrocode}
\def\@newadjustboxenv#1[#2]{%
    \@ifnextchar{[}%
        {\@@newadjustboxenv{#1}{#2}}%
        {\@@@newadjustboxenv{#1}{[#2]}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@newadjustboxenv}[3]{<environment name>}{<previous optional argument>}{<optional argument>}
%    \begin{macrocode}
\def\@@newadjustboxenv#1#2[#3]{%
    \@@@newadjustboxenv{#1}{[#2][#3]}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@@newadjustboxenv@}[3]{<environment name>}{<optional arguments in brackets>}{<keys>}
%    \begin{macrocode}
\def\@@@newadjustboxenv@#1#2#3{%
    \expandafter
    \endgroup
    \new@adjustbox{#1}#2{%
        \begingroup
        \@collectboxisenv{#1}%
        \@adjustbox{#3}%
    }{%
        \collectboxenvend
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@@newadjustboxenv}[3]{<environment name>}{<optional arguments in brackets>}{<keys>}
%    \begin{macrocode}
\def\@@@newadjustboxenv#1#2#3{%
    \expandafter
    \endgroup
    \expandafter
    \expandafter\new@adjustbox\csname #1\endcsname#2{%
        \begingroup
        \collectboxcheckenv{#1}%
        \@adjustbox{#3}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@@newadjustboxcmd}[3]{<environment name>}{<optional arguments in brackets>}{<keys>}
%    \begin{macrocode}
\def\@@@newadjustboxcmd#1#2#3{%
    \expandafter
    \endgroup
    \new@adjustbox{#1}#2{%
        \begingroup
        \@adjustbox{#3}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\newadjustimage}
%    \begin{macrocode}
\newcommand*\newadjustimage{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustimage
    \def\new@adjustbox{\newcommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\renewadjustimage}
%    \begin{macrocode}
\newcommand*\renewadjustimage{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustimage
    \def\new@adjustbox{\renewcommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}%
%
% \begin{macro}{\provideadjustimage}
%    \begin{macrocode}
\newcommand*\provideadjustimage{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustimage
    \def\new@adjustbox{\providecommand}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\declareadjustimage}
%    \begin{macrocode}
\newcommand*\declareadjustimage{%
    \begingroup
    \let\@@@newadjustboxenv\@@@newadjustimage
    \def\new@adjustbox##1{\let##1\@undefined\newcommand{##1}}%
    \newadjustboxenv@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@@newadjustimage}[3]{<macro name>}{<optional arguments in brackets>}{<keys>}
%    \begin{macrocode}
\def\@@@newadjustimage#1#2#3{%
    \expandafter
    \endgroup
    \new@adjustbox{#1}#2{%
        \begingroup
        \def\@tempa####1{%
            \def\IMAGEFILENAME{####1}%
            \@adjustbox{#3}{\Gin@clipfalse\expandafter\Gin@i\expandafter{\IMAGEFILENAME}}%
        }%
        \@tempa
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\NewAdjustImage}
%    \begin{macrocode}
\newcommand*\adjustbox@NewAdjustImage[4]{%
    \adjustbox@checkforxparse
    #1{#2}{#3}{%
        \begingroup
        \def\@tempa####1{%
            \def\IMAGEFILENAME{####1}%
            \@adjustbox{#4}{\Gin@clipfalse\expandafter\Gin@i\expandafter{\IMAGEFILENAME}}%
        }%
        \@tempa
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\NewAdjustImage}
%    \begin{macrocode}
\newcommand*\NewAdjustImage{%
    \adjustbox@NewAdjustImage\NewDocumentCommand
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\RenewDocumentCommand}
%    \begin{macrocode}
\newcommand*\RenewAdjustImage{%
    \adjustbox@NewAdjustImage\RenewDocumentCommand
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ProvideAdjustImage}
%    \begin{macrocode}
\newcommand*\ProvideAdjustImage{%
    \adjustbox@NewAdjustImage\ProvideDocumentCommand
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\DeclareAdjustImage}
%    \begin{macrocode}
\newcommand*\DeclareAdjustImage{%
    \adjustbox@NewAdjustImage\ProvideDocumentCommand
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\NewAdjustImage}
%    \begin{macrocode}
\def\adjustbox@checkforxparse{%
    \begingroup
    \expandafter\ifx\csname ver@xparse.sty\endcsname\relax
        \PackageError{adjustbox}{%
            The 'xparse' package must be loaded separately in\MessageBreak
            order to use the following macros: \MessageBreak
             \string\NewAdjustImage,
             \string\RenewAdjustImage, \MessageBreak
             \string\ProvideAdjustImage,
             \string\DeclareAdjustImage}{}
    \fi
    \endgroup
    \let\adjustbox@checkforxparse\relax
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Internal code adding macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\adjbox@Gin@add}[1]{<code>}
%    \begin{macrocode}
\def\adjbox@Gin@add#1{%
    \def\@tempa{#1}%
    \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}}%
}
\def\adjbox@Gin@Add{%
    \Gin@esetsize
    \@tempswatrue
    \adjbox@Gin@add
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\newadjustboxkey}
%    \begin{macrocode}
\newcommand\newadjustboxkey{%
    \@adjustboxkey\adjustbox@newkey
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\renewadjustboxkey}
%    \begin{macrocode}
\newcommand\renewadjustboxkey{%
    \@adjustboxkey\adjustbox@renewkey
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\provideadjustboxkey}
%    \begin{macrocode}
\newcommand\provideadjustboxkey{%
    \@adjustboxkey\adjustbox@providekey
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\defadjustboxkey}
%    \begin{macrocode}
\newcommand\defadjustboxkey{%
    \@adjustboxkey\@secondoftwo
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@adjustboxkey}[1]{<key name>}
%    \begin{macrocode}
\def\@adjustboxkey#1{%
    \@ifstar
        {\@adjustboxkey@i#1*}%
        {\@adjustboxkey@i#1\relax}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@adjustboxkey@i}
%    \begin{macrocode}
\def\@adjustboxkey@i#1#2#3{%
    \@ifnextchar{[}%
        {\@adjustboxkey@ii#1#2{#3}}%
        {\@adjustboxkey@ii#1#2{#3}[\@nnil]}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@adjustboxkey@ii}
%    \begin{macrocode}
\def\@adjustboxkey@ii#1#2#3[#4]#5{%
  \ifx\@nnil#4\relax
    \@adjustboxkey@iii#1#2{#3}{}{#5}%
  \else
    \@adjustboxkey@iii#1#2{#3}{[#4]}{#5}%
  \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@adjustboxkey@iv}
%    \begin{macrocode}
\def\@adjustboxkey@iii#1#2#3#4#5{%
  #1{#3}{%
    \ifx*#2\relax
        \define@key\adjbox@fam{#3}#4{#5}%
    \else
        \define@key\adjbox@fam{#3}#4{%
            \adjbox@Gin@Add{\@Collectbox{#5}}%
        }%
    \fi
  }{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\define@adjboxkey}
%    \begin{macrocode}
\def\define@adjboxkey#1#2{%
    \define@key\adjbox@fam{#1}{%
        \adjbox@Gin@Add{#2}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\define@adjboxkey@defvalue}
%    \begin{macrocode}
\def\define@adjboxkey@defvalue#1#2#3{%
    \define@key\adjbox@fam{#1}[{#2}]{%
        \adjbox@Gin@Add{#3}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\define@adjboxkey@novalue}
%    \begin{macrocode}
\def\define@adjboxkey@novalue#1#2{%
    \define@key\adjbox@fam{#1}[\@nil]{%
        \adjbox@novalue{##1}%
        \adjbox@Gin@Add{#2}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@novalue}
%    \begin{macrocode}
\def\adjbox@novalue#1{%
    \ifx\@nil#1\else
        \PackageWarning{adjustbox}{%
            Key '\XKV@tkey' does not await a value.\MessageBreak
            Given value will be ignored%
        }%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjustbox@newkey}
%    \begin{macrocode}
\def\adjustbox@newkey#1#2{%
    \@ifundefined{KV@\adjbox@fam @#1}{#2}{%
        \PackageError{adjustbox}{Key '#1' already defined}{}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjustbox@renewkey}
%    \begin{macrocode}
\def\adjustbox@renewkey#1{%
    \@ifundefined{KV@\adjbox@fam @#1}{%
        \PackageError{adjustbox}{Key '#1' undefined}{}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjustbox@providekey}
%    \begin{macrocode}
\def\adjustbox@providekey#1#2{%
    \@ifundefined{KV@\adjbox@fam @#1}{#2}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\adjbox@let@key}
% Aliases one key to another.
%    \begin{macrocode}
\def\adjbox@let@key#1#2#3{%
    \expandafter\let\csname KV@#1@#2\expandafter\endcsname\csname KV@#1@#3\endcsname
    \expandafter\let\csname KV@#1@#2@default\expandafter\endcsname\csname KV@#1@#3@default\endcsname
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@copy@key}
% Aliases one key to another.
%    \begin{macrocode}
\def\adjbox@copy@key#1{%
    \expandafter\let
    \csname KV@ADJBOX@#1\expandafter\endcsname
    \csname KV@Gin@#1\endcsname
    \expandafter\let
    \csname KV@ADJBOX@#1@default\expandafter\endcsname
    \csname KV@Gin@#1@default\endcsname
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Keys for trimming, clipping, viewport and margin} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{key}{adjbox}{viewport}
%    \begin{macrocode}
\define@key{adjbox}{viewport}{%
    \def\adjustbox@content{%
        \@trimclip{%
            \ifGin@clip
                \expandafter\@clipvpbox
            \else
                \expandafter\@viewportbox
            \fi
        }{#1}%
    }%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{Viewport}
%    \begin{macrocode}
\define@adjboxkey{Viewport}{\trimbox@s{#1}}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{trim}
%    \begin{macrocode}
\define@key{adjbox}{trim}{%
    \def\adjustbox@content{%
        \@trimclip{%
            \ifGin@clip
                \expandafter\@clipbox
            \else
                \expandafter\@trimbox
            \fi
        }{#1}%
    }%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{Trim}
%    \begin{macrocode}
\define@adjboxkey{Trim}{\trimbox@{#1}}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{Clip}
%    \begin{macrocode}
\define@adjboxkey{Clip}{\clipbox@{#1}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{rndcorners}
%    \begin{macrocode}
\define@adjboxkey{rndcorners}{\rndcornersbox@{#1}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{rndframe}
%    \begin{macrocode}
\define@adjboxkey{rndframe}{%
    \@ifnextchar\bgroup{%
        \adjbox@rndframe{sep=\z@}%
    }{%
        \adjbox@rndframe{sep=\z@}{}%
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{rndfbox}
%    \begin{macrocode}
\define@adjboxkey{rndfbox}{%
    \@ifnextchar\bgroup{%
        \adjbox@rndframe{}%
    }{%
        \adjbox@rndframe{}{}%
    }#1\@nnil
}

\def\adjbox@rndframe#1#2#3\@nnil{%
    \rndfbox[{#1,#2}]{#3}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{Clip*}
%    \begin{macrocode}
\define@adjboxkey{Clip*}{\clipbox@s{#1}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{margin}
%    \begin{macrocode}
\define@adjboxkey{margin}{\marginbox@{#1}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{margin*}
%    \begin{macrocode}
\define@adjboxkey{margin*}{\marginbox@s{#1}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{padding}
% Alias for \Key{margin}.
%    \begin{macrocode}
\adjbox@let@key\adjbox@fam{padding}{margin}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{padding*}
% Alias for \Key{margin*}.
%    \begin{macrocode}
\adjbox@let@key\adjbox@fam{padding*}{margin*}
%    \end{macrocode}
% \end{key}
%
%
%    \begin{macrocode}
\adjbox@copy@key{bbllx}
\adjbox@copy@key{bblly}
\adjbox@copy@key{bburx}
\adjbox@copy@key{bbury}
\adjbox@copy@key{bb}
\adjbox@copy@key{command}
\adjbox@copy@key{decodearray}
\adjbox@copy@key{draft}
\adjbox@copy@key{ext}
\adjbox@copy@key{intent}
\adjbox@copy@key{interpolate}
\adjbox@copy@key{maskarray}
\adjbox@copy@key{natheight}
\adjbox@copy@key{natwidth}
\adjbox@copy@key{ocobjnum}
\adjbox@copy@key{ocobjref}
\adjbox@copy@key{origin}
\adjbox@copy@key{pagebox}
\adjbox@copy@key{page}
\adjbox@copy@key{quiet}
\adjbox@copy@key{read}
\adjbox@copy@key{resetcolor}
\adjbox@copy@key{resolution}
\adjbox@copy@key{type}
\adjbox@copy@key{xmpfile}
%    \end{macrocode}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Round corners} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\rndcornersbox}
%    \begin{macrocode}
\newcommand\rndcornersbox{%
    \collectboxcheckenv{rndcornersbox}%
    \rndcornersbox@
}
\def\rndcornersbox@#1{%
    \collectbox{\@trimclip\@clipcornersofbox{#1}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\rndframebox}
%    \begin{macrocode}
\newcommand\rndframebox{%
    \collectboxcheckenv{rndframebox}%
    \rndframebox@
}
\newcommand*\rndframebox@[2][]{%
    \collectbox{\@trimclip{\rndframearoundbox@{sep=\z@,#1}}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\rndfbox}
%    \begin{macrocode}
\newcommand\rndfbox{%
    \collectboxcheckenv{rndfbox}%
    \rndfbox@
}
\newcommand*\rndfbox@[2][]{%
    \collectbox{\@trimclip{\rndframearoundbox@{#1}}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\rndframearoundbox@}
%    \begin{macrocode}
\newif\ifadjbox@rndframe@clip
\def\rndframearoundbox@#1#2#3#4#5#6{%
    \setkeys{adjbox@rndframe}{#1}%
    \@rndframearoundbox{#2}{#3}{#4}{#5}{#6}{\ifadjbox@rndframe@clip\relax\fi}%
}
\define@key{adjbox@rndframe}{width}{%
    \adjsetlength\fboxrule{#1}%
}
\define@key{adjbox@rndframe}{sep}{%
    \adjsetlength\fboxsep{#1}%
}
\define@key{adjbox@rndframe}{color}{%
    \def\adjbox@rndframe@color{\color{#1}}%
}
\define@key{adjbox@rndframe}{color*}{%
    \def\adjbox@rndframe@color{#1}%
}
\let\adjbox@rndframe@color\relax
\define@key{adjbox@rndframe}{clip}[true]{%
    \csname adjbox@rndframe@clip#1\endcsname
}
%    \end{macrocode}
% \end{macro}
%
%
%    \begin{macrocode}
% \DescribeKey{color}'='{<color>}
% \DescribeKey{color*}'='{<color command>}
% \DescribeKey{width}'='{<rule width>}
% \DescribeKey{sep}'='{<rule separation>}
%    \end{macrocode}
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Scaling and rotating keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{scale}
%    \begin{macrocode}
\define@key\adjbox@fam{scale}{%
    \@ifnextchar\bgroup{%
        \adjbox@scale@xy
    }{%
        \adjbox@scale@x
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@scale@x}
%    \begin{macrocode}
\def\adjbox@scale@x#1\@nnil{%
    \adjbox@scale@xy{#1}{#1}\@nnil%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@scale@xy}
%    \begin{macrocode}
\def\adjbox@scale@xy#1#2\@nnil{%
  \if@tempswa
    \adjbox@Gin@add{\Gscale@box{#1}[{#2}]}%
  \else
    \def\Gin@req@sizes{%
      \def\Gin@scalex{#1}\def\Gin@scaley{#2}%
      \Gin@req@height\Gin@scaley\Gin@nat@height
      \Gin@req@width\Gin@scalex\Gin@nat@width}%
  \fi
  \@tempswatrue
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{reflect}
% Taken from the \Key{scale} key of the \pkg{graphicx} package.
% Open question: why is \Macro\Gin@esetsize not called?
%    \begin{macrocode}
\define@key\adjbox@fam{reflect}[]{%
    \adjbox@scale@xy{-1}{1}\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{rotate}
% New alias of existing |angle| key.
%    \begin{macrocode}
\expandafter\let\csname KV@\adjbox@fam @rotate\endcsname\KV@Gin@angle
%    \end{macrocode}
% \end{key}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Horizontal alignment keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{macro}{\adjbox@halign}[3]{<official width>}{<aligner left>}{<aligner right>}
%    \begin{macrocode}
\def\adjbox@halign#1#2#3{%
    \@collectbox{\@adjbox@halign{#1}{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@adjbox@halign}[3]{<official width>}{<aligner left>}{<aligner right>}
%    \begin{macrocode}
\def\@adjbox@halign#1#2#3{%
    \begingroup
    \adjsetlength\@tempdima{#1}%
    \leavevmode\hb@xt@\the\@tempdima{#2\BOXCONTENT#3}%
    \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{key}{adjbox}{center}[1]{<official width>}
%    \begin{macrocode}
\define@adjboxkey@defvalue{center}{\linewidth}{\adjbox@halign{#1}\hss\hss}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{left}[1]{<official width>}
%    \begin{macrocode}
\define@adjboxkey@defvalue{left}{\linewidth}{\adjbox@halign{#1}\relax\hss}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{right}[1]{<official width>}
%    \begin{macrocode}
\define@adjboxkey@defvalue{right}{\linewidth}{\adjbox@halign{#1}\hss\relax}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\centerbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\centerbox[1][\linewidth]{%
    \collectboxcheckenv{centerbox}%
    \noindent
    \adjbox@halign{#1}\hss\hss
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\leftalignbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\leftalignbox[1][\linewidth]{%
    \collectboxcheckenv{leftalignbox}%
    \noindent
    \adjbox@halign{#1}\relax\hss
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\rightalignbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\rightalignbox[1][\linewidth]{%
    \collectboxcheckenv{rightalignbox}%
    \noindent
    \adjbox@halign{#1}\hss\relax
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{outer}[1]{<official width>}
%    \begin{macrocode}
\define@adjboxkey@defvalue{outer}{\linewidth}{%
    \outersidebox[{#1}]%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{inner}[1]{<official width>}
%    \begin{macrocode}
\define@adjboxkey@defvalue{inner}{\linewidth}{%
    \innersidebox[{#1}]%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\outersidebox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\outersidebox[1][\linewidth]{%
    \collectboxcheckenv{outersidebox}%
    \noindent
    \adjbox@halign{#1}{%
        \checkoddpage
        \ifoddpageoroneside
            \hss
        \else
            \relax
        \fi
    }{%
        \ifoddpageoroneside
            \relax
        \else
            \hss
        \fi
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\innersidebox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\innersidebox[1][\linewidth]{%
    \collectboxcheckenv{innersidebox}%
    \noindent
    \adjbox@halign{#1}{%
        \checkoddpage
        \ifoddpageoroneside
            \relax
        \else
            \hss
        \fi
    }{%
        \ifoddpageoroneside
            \hss
        \else
            \relax
        \fi
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{pagecenter}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{pagecenter}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\pagecenterbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{pageleftalign}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{pageleftalign}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\pageleftalignbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{pagerightalign}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{pagerightalign}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\pagerightalignbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{pageinner}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{pageinner}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\pageinnerbox[{#1}]}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{pageouter}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{pageouter}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\pageouterbox[{#1}]}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{textareacenter}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{textareacenter}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\textareacenterbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{textarealeftalign}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{textarealeftalign}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\textarealeftalignbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{textarearightalign}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{textarearightalign}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\textarearightalignbox[{#1}]}%
}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{textareainner}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{textareainner}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\textareainnerbox[{#1}]}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{textareaouter}[1]{<official width>}
%    \begin{macrocode}
\define@key\adjbox@fam{textareaouter}[\linewidth]{%
    \noindent\leavevmode
    \adjbox@Gin@Add{\textareaouterbox[{#1}]}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\pagecenterbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\pagecenterbox[1][\linewidth]{%
    \collectboxcheckenv{pagecenterbox}%
    \noindent\leavevmode\checkoddpage
    \@collectbox{\@pagecenterbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi+.5\paperwidth-.5\@tempdimc-\@totalleftmargin}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@pagecenterbox}[2]{<official width>}{<lap amount>}
%    \begin{macrocode}
\def\@pagecenterbox#1#2{%
    \adjsetlength\@tempdimc{#1}%
    \ifdim\@tempdimc<\z@
        \@tempdimc=\z@
    \fi
    \adjsetlength\@tempdima{#2}%
    \ifdim\@tempdima<\z@
        \@tempdimb=-\@tempdima
    \else
        \@tempdimb=\@tempdima
    \fi
    \ifdim\@tempdima<\z@
        \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdimb{\hb@xt@\@tempdimc{\hss\usebox\collectedbox\hss}\hss}\hskip\@tempdimc}%
    \else
        \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdimb{\hss\hb@xt@\@tempdimc{\hss\usebox\collectedbox\hss}}\hss}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\textareacenterbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\textareacenterbox[1][\linewidth]{%
    \collectboxcheckenv{textareacenterbox}%
    \noindent\leavevmode
    \@collectbox{\@pagecenterbox{#1}{-\@totalleftmargin+.5\textwidth-.5\linewidth}}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\pageleftalignbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\pageleftalignbox[1][\linewidth]{%
    \collectboxcheckenv{pageleftalignbox}%
    \noindent\leavevmode\checkoddpage
    \@collectbox{\@lapbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi-\@totalleftmargin}}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\pagerightalignbox}[1]{<official width>}
% Note: \Macro\@tempdimc holds the official width inside \Macro\@lapbox.
%    \begin{macrocode}
\newcommand\pagerightalignbox[1][\linewidth]{%
    \collectboxcheckenv{pagerightalignbox}%
    \noindent\leavevmode\checkoddpage
    \@collectbox{\@lapbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi-\@totalleftmargin+\paperwidth-(#1)}}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\textarealeftalignbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\textarealeftalignbox[1][\linewidth]{%
    \collectboxcheckenv{textarealeftalignbox}%
    \noindent\leavevmode\checkoddpage
    \@collectbox{\@textarealeftalignbox{#1}}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\@textarealeftalignbox}[1]{<official width>}
%    \begin{macrocode}
\def\@textarealeftalignbox#1{%
    \adjsetlength\@tempdima{\@totalleftmargin}%
    \adjsetlength\@tempdimc{#1}%
    \ifdim\@tempdimc<\z@
        \@tempdimc=\z@
    \fi
    \leavevmode
    \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdima{\usebox\collectedbox\hss}\hskip\@tempdimc}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\textarearightalignbox}[1]{<official width>}
%    \begin{macrocode}
\newcommand\textarearightalignbox[1][\linewidth]{%
    \collectboxcheckenv{textarearightalignbox}%
    \noindent\leavevmode\checkoddpage
    \@collectbox{\@textarearightalignbox{#1}{+\textwidth}}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{\@textarearightalignbox}[1]{<official width>}
%    \begin{macrocode}
\def\@textarearightalignbox#1#2{%
    \adjsetlength\@tempdimc{#1}%
    \ifdim\@tempdimc<\z@
        \@tempdimc=\z@
    \fi
    \adjsetlength\@tempdima{-\@totalleftmargin+\textwidth-\@tempdimc}%
    \ifdim\@tempdima<\z@
        \@tempdima=-\@tempdima
    \fi
    \leavevmode
    \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdima{\hss\usebox\collectedbox}\hss}%
}
%    \end{macrocode}
% \end{macro}%
%
%
% \begin{macro}{pageinnerbox}
%    \begin{macrocode}
\newcommand\pageinnerbox{%
    \noindent\leavevmode\checkoddpage
    \ifoddpageoroneside
        \expandafter\pageleftalignbox
    \else
        \expandafter\pagerightalignbox
    \fi
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{pageouterbox}
%    \begin{macrocode}
\newcommand\pageouterbox{%
    \noindent\leavevmode\checkoddpage
    \ifoddpageoroneside
        \expandafter\pagerightalignbox
    \else
        \expandafter\pageleftalignbox
    \fi
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{textareaouterbox}
%    \begin{macrocode}
\newcommand\textareainnerbox{%
    \noindent\leavevmode\checkoddpage
    \ifoddpageoroneside
        \expandafter\textarealeftalignbox
    \else
        \expandafter\textarearightalignbox
    \fi
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{textareaouterbox}
%    \begin{macrocode}
\newcommand\textareaouterbox{%
    \noindent\leavevmode\checkoddpage
    \ifoddpageoroneside
        \expandafter\textarearightalignbox
    \else
        \expandafter\textarealeftalignbox
    \fi
}%
%    \end{macrocode}
% \end{macro}%
%
%
%    \begin{macrocode}
\IfFileExists{ifoddpage.sty}{%
    \RequirePackage{ifoddpage}%
}{%
    \def\checkoddpage{%
        \PackageError{adjustbox}{%
                The used key, macro or environment requires \MessageBreak
                the 'ifoddpage' package which is not installed!}{}%
    }
}%
%    \end{macrocode}
%
%
% \begin{key}{adjbox}{noindent}
%    \begin{macrocode}
\define@key\adjbox@fam{noindent}[]{%
    \noindent
}
%    \end{macrocode}
% \end{key}%
%
% \begin{key}{adjbox}{leavevmode}
%    \begin{macrocode}
\define@key\adjbox@fam{leavevmode}[]{%
    \leavevmode
}
%    \end{macrocode}
% \end{key}%
%
% \begin{macro}{\adjbox@fam}{process}
%    \begin{macrocode}
\define@key\adjbox@fam{process}[]{%
    \sbox\collectedbox{\adjbox@esetsize\the\toks@}%
    \collectbox@setdims
    \def\adjustbox@content{\usebox\collectedbox}%
    \toks@{{\adjustbox@content}}
}
%    \end{macrocode}
% \end{macro}
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Vertical alignment keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{raise}
%    \begin{macrocode}
\define@key\adjbox@fam{raise}{%
    \@ifnextchar\bgroup{%
        \adjbox@raise
    }{%
        \adjbox@raise{#1}{}{}%
    }#1{}{}{}\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@raise}
%    \begin{macrocode}
\def\adjbox@raise#1#2#3#4\@nnil{%
    \adjbox@Gin@Add{\adjbox@raisebox{#1}{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@raisebox}[3]{raise amount}{height}{depth}
%    \begin{macrocode}
\def\adjbox@raisebox#1#2#3{%
    \@collectbox{\adjbox@@raisebox{#1}{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@@raisebox}[3]{raise amount}{height}{depth}
%    \begin{macrocode}
\def\adjbox@@raisebox#1#2#3{%
    \ifx\@nnil#1\@nnil
        \setbox\@tempboxa\copy\collectedbox
    \else
        \adjsetlength\@tempdima{#1}%
        \setbox\@tempboxa\hbox{\raise\@tempdima\copy\collectedbox}%
    \fi
    \ifx\@nnil#2\@nnil\else
        \adjsetlength\@tempdima{#2}%
        \ht\@tempboxa\@tempdima
    \fi
    \ifx\@nnil#3\@nnil\else
        \adjsetlength\@tempdima{#3}%
        \dp\@tempboxa\@tempdima
    \fi
    \leavevmode
    \box\@tempboxa
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{valign}
%    \begin{macrocode}
\define@key\adjbox@fam{valign}{%
    \expandafter\adjbox@Gin@Add\expandafter{\csname adjbox@valign@#1\endcsname}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjboxvtop}
%    \begin{macrocode}
\def\adjboxvtop{\ht\strutbox}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\adjboxvcenter}
%    \begin{macrocode}
\def\adjboxvcenter{1ex}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\adjboxvbottom}
%    \begin{macrocode}
\def\adjboxvbottom{-\dp\strutbox}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@t}
%    \begin{macrocode}
\def\adjbox@valign@t{%
    \adjbox@raisebox{-\height+\adjboxvtop}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@T}
%    \begin{macrocode}
\def\adjbox@valign@T{%
    \adjbox@raisebox{-\height}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@M}
%    \begin{macrocode}
\def\adjbox@valign@M{%
    \adjbox@raisebox{.5\depth-.5\height}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@m}
%    \begin{macrocode}
\def\adjbox@valign@m{%
    \adjbox@raisebox{.5\depth-.5\height+\adjboxvcenter}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@c}
%    \begin{macrocode}
\def\adjbox@valign@c#1{%
    \leavevmode
    \hbox{%
        $\vcenter{\hbox{#1}}\m@th$%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@b}
%    \begin{macrocode}
\def\adjbox@valign@b{%
    \adjbox@raisebox{\depth+\adjboxvbottom}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@valign@B}
%    \begin{macrocode}
\def\adjbox@valign@B{%
    \adjbox@raisebox{\depth}{}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Set vertical sizes} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{set height}
%    \begin{macrocode}
\define@adjboxkey{set height}{\adjbox@raisebox{}{#1}{}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{set depth}
%    \begin{macrocode}
\define@adjboxkey{set depth}{\adjbox@raisebox{}{}{#1}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{set vsize}
% Uses the same code like \Key{raise} but with the raise value of 0pt,
% i.e.\ only sets the height and depth.
%    \begin{macrocode}
\define@adjboxkey{set vsize}{\adjbox@raisebox{}#1}
%    \end{macrocode}
% \end{key}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Vertical spacing} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{vspace}
%    \begin{macrocode}
\define@key\adjbox@fam{vspace}{%
    \adjbox@vskip#1 {} \@nnil{}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{vspace*}
%    \begin{macrocode}
\define@key\adjbox@fam{vspace*}{%
    \adjbox@vskip#1 {} \@nnil*%
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@vskip}
%    \begin{macrocode}
\def\adjbox@vskip#1 #2 #3\@nnil#4{%
    \ifx\@nnil#2\@nnil
        \adjust@addcode{\par\vspace#4{#1}\noindent}{\par\vspace#4{#1}}%
    \else
        \adjust@addcode{\par\vspace#4{#1}\noindent}{\par\vspace#4{#2}}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Minimum and maximum size keys and macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{min width}
%    \begin{macrocode}
\define@adjboxkey{min width}{\@minsizebox\height{#1}!}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{max width}
%    \begin{macrocode}
\define@adjboxkey{max width}{\@maxsizebox\height{#1}!}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{min height}
%    \begin{macrocode}
\define@adjboxkey{min height}{\@minsizebox\height!{#1}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{max height}
%    \begin{macrocode}
\define@adjboxkey{max height}{\@maxsizebox\height!{#1}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{min totalheight}
%    \begin{macrocode}
\define@adjboxkey{min totalheight}{\@minsizebox\totalheight!{#1}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{max totalheight}
%    \begin{macrocode}
\define@adjboxkey{max totalheight}{\@maxsizebox\totalheight!{#1}}
%    \end{macrocode}
% \end{key}
%
%
%
% \begin{macro}{\adjbox@Gin@sizeadd}
% Checks if key-value is actually two arguments. If not it is doubled.
% E.g.: \verb+min size=\A+ is the same as  \verb+min size={\A}{\A}+
%    \begin{macrocode}
\def\adjbox@Gin@sizeadd#1#2\@nnil{%
    \@ifnextchar\bgroup{%
        \adjbox@Gin@Add{#1#2}%
        \remove@to@nnil
    }{%
        \adjbox@Gin@Add{#1{#2}{#2}}%
        \remove@to@nnil
    }#2\@nnil
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{min size}
%    \begin{macrocode}
\define@key\adjbox@fam{min size}{%
    \adjbox@Gin@sizeadd{\@minsizebox\height}#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{max size}
%    \begin{macrocode}
\define@key\adjbox@fam{max size}{%
    \adjbox@Gin@sizeadd{\@maxsizebox\height}#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{min totalsize}
%    \begin{macrocode}
\define@key\adjbox@fam{min totalsize}{%
    \adjbox@Gin@sizeadd{\@minsizebox\totalheight}#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{max totalsize}
%    \begin{macrocode}
\define@key\adjbox@fam{max totalsize}{%
    \adjbox@Gin@sizeadd{\@maxsizebox\totalheight}#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{warn width}
%    \begin{macrocode}
\define@adjboxkey@defvalue{warn width}{\linewidth}{\@Collectbox{\adjbox@warnwidth{#1}}}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@warnwidth}
% Warn if width is wider than the given width plus |\hfuzz|.
%    \begin{macrocode}
\def\adjbox@warnwidth#1{%
        \@tempdima=#1\relax
        \advance\@tempdima by -\width
        \@tempdima=-\@tempdima
        \ifdim\@tempdima>\hfuzz
            \typeout{Overfull \string\hbox\space (\the\@tempdima\space too wide) in adjustbox at
                \ifnum\adjbox@line=\inputlineno
                    line \adjbox@line
                \else
                    lines \adjbox@line--\the\inputlineno
                \fi
            }%
        \fi
        \BOXCONTENT
}
%    \end{macrocode}
% \end{macro}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\minsizebox}
%    \begin{macrocode}
\newcommand*\minsizebox{%
    \collectboxcheckenv{minsizebox}%
    \@ifstar{\@minsizebox\totalheight}{\@minsizebox\height}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{minsizebox*}
%    \begin{macrocode}
\expandafter\newcommand\expandafter*\csname minsizebox*\endcsname{%
    \@collectboxisenv{minsizebox*}%
    \@minsizebox\totalheight
}
%    \end{macrocode}
% \end{environment}
%
%
% \begin{macro}{\@minsizebox}
%    \begin{macrocode}
\newcommand*\@minsizebox[3]{%
    \@collectbox{\@minmaxsizebox>#1{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\maxsizebox}
%    \begin{macrocode}
\newcommand*\maxsizebox{%
    \collectboxcheckenv{maxsizebox}%
    \@ifstar{\@maxsizebox\totalheight}{\@maxsizebox\height}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{maxsizebox*}
%    \begin{macrocode}
\expandafter\newcommand\expandafter*\csname maxsizebox*\endcsname{%
    \@collectboxisenv{maxsizebox*}%
    \@maxsizebox\totalheight
}
%    \end{macrocode}
% \end{environment}
%
%
% \begin{macro}{\@maxsizebox}
%    \begin{macrocode}
\newcommand*\@maxsizebox[3]{%
    \@collectbox{\@minmaxsizebox<#1{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@minmaxsizebox}[4]{Compare sign \texttt{<} or \texttt{>}}{\cs{height} or \cs{totalheight}}{width}{height}
% Used for all min/max-size boxes including the starred version. The first two arguments determine the style.
%
% The width and height values are expanded to allow for \Macro\ifdim or similar conditionals.
%    \begin{macrocode}
\newcommand*\@minmaxsizebox[4]{%
    \edef\@tempa{#3}%
    \edef\@tempb{#4}%
    \ifx\@tempa\Gin@exclamation\else
        \adjsetlength\@tempdima{#3}%
    \fi
    \ifx\@tempb\Gin@exclamation\else
        \adjsetlength\@tempdimb{#4}%
    \fi
    \ifcase0%
%    \end{macrocode}
% Do nothing if both values are `|!|', otherwise use case 1 if the height is to large/small (|#1|)
% than the \Macro\height or \Macro\totalheight (|#2|).
%    \begin{macrocode}
    \ifx\@tempa\Gin@exclamation
        \ifx\@tempb\Gin@exclamation
        \else
            \ifdim\@tempdimb#1#2%
                1%
            \fi
        \fi
    \else
%    \end{macrocode}
% If the width is given, but not the height, use case 2 if the width is to large/small (|#1|) than the native \Macro\width.
%    \begin{macrocode}
        \ifx\@tempb\Gin@exclamation
            \ifdim\@tempdima#1\width
                2%
            \fi
        \else
%    \end{macrocode}
% If both values are given.
% Use case 0-3 depending if the width and/or height is to large/small.
%    \begin{macrocode}
            \ifdim\@tempdima#1\width
                \ifdim\@tempdimb#1#2%
                    3%
                \else
                    2%
                \fi
            \else
                \ifdim\@tempdimb#1#2%
                    1%
                \fi
            \fi
        \fi
    \fi
%    \end{macrocode}
%  Case 0: no scaling is needed. Insert content unchanged.
%    \begin{macrocode}
    \relax% 0
        \BOXCONTENT
%    \end{macrocode}
%  Case 1: height needs scaling. Calculate factor and scale the content with it.
%    \begin{macrocode}
    \or
        \Gscale@div\@tempa\@tempdimb#2%
        \Gscale@box\@tempa[\@tempa]\BOXCONTENT
%    \end{macrocode}
%  Case 2: width needs scaling. Calculate factor and scale the content with it.
%    \begin{macrocode}
    \or
        \Gscale@div\@tempa\@tempdima\width
        \Gscale@box\@tempa[\@tempa]\BOXCONTENT
%    \end{macrocode}
%  Case 3: both width and height need scaling.
%  Both scale factors are calculated and the more extreme value is used.
%    \begin{macrocode}
    \or
        \Gscale@div\@tempa\@tempdima\width
        \Gscale@div\@tempb\@tempdimb#2%
        \ifdim\@tempa\p@#1\@tempb\p@
            \let\@tempb\@tempa
        \else
            \let\@tempa\@tempb
        \fi
        \Gscale@box\@tempa[\@tempb]\BOXCONTENT
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Frame keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{key}{adjbox}{frame}
% As 0--3 arguments: rule width, (inner) separation and margin.
%    \begin{macrocode}
\define@key\adjbox@fam{frame}[{{\fboxrule}}]{%
    \adjbox@frame{\fboxsep\z@}#1 {} {} \relax\relax\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{fbox}
% Same as \Key{frame} but with different default separation.
%    \begin{macrocode}
\define@key\adjbox@fam{fbox}[{{\fboxrule}}]{%
    \adjbox@frame{}#1 {} {} {} \relax\relax\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@frame}
%    \begin{macrocode}
\def\adjbox@frame#1#2 #3 #4 #5\relax{%
    \adjbox@Gin@Add{%
        \@Collectbox{#1\adjbox@@frame{}{#2}{#3}{#4}}%
    }%
    \remove@to@nnil
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{cframe}
%    \begin{macrocode}
\define@key\adjbox@fam{cframe}{%
    \adjbox@checkcolor
    \adjbox@cframe{\fboxsep\z@}#1 {} {} {} \relax\relax\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{cfbox}
%    \begin{macrocode}
\define@key\adjbox@fam{cfbox}{%
    \adjbox@checkcolor
    \adjbox@cframe{}#1 {} {} {} \relax\relax\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@cframe}
%    \begin{macrocode}
\def\adjbox@cframe#1#2 #3 #4 #5 #6\relax{%
    \adjbox@Gin@Add{%
        \@Collectbox{#1\adjbox@@frame{\color{#2}}{#3}{#4}{#5}}%
    }%
    \remove@to@nnil
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@checkcolor}
%    \begin{macrocode}
\def\adjbox@checkcolor{%
    \ifcase0%
        \expandafter\ifx\csname ver@xcolor.sty\endcsname\relax
        \expandafter\ifx\csname ver@color.sty\endcsname\relax
        \expandafter\ifx\csname ver@xxcolor.sty\endcsname\relax 1\fi\fi\fi
    \relax
        \global\let\adjbox@checkcolor\relax
    \else
        \PackageError{adjustbox}{Using a macro, environment or key with color\MessageBreak
                requires a color package to be loaded manually.\MessageBreak
                Recommended is 'xcolor' but 'color' is ok, too}{}.
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@@frame}[4]{content}{rule width}{separation}{margin}
%    \begin{macrocode}
\def\adjbox@@frame#1#2#3#4{%
    \leavevmode
    \ifx\@nnil#2\@nnil\else
        \adjsetlength\fboxrule{#2}%
    \fi
    \ifx\@nnil#3\@nnil\else
        \adjsetlength\fboxsep{#3}%
    \fi
    \adjsetlength\tc@llx{\fboxrule + \fboxsep}%
    \@marginbox\collectedbox\tc@llx\tc@llx\tc@llx\tc@llx
    \ifx\@nnil#4\@nnil\else
      \setbox\collectedbox
    \fi
      \hbox\bgroup\color@setgroup
        \BOXCONTENT
        \hskip-\width
        #1%
        \adjbox@boxframe\width\height\depth
      \color@endgroup\egroup
    \ifx\@nnil#4\@nnil\else
      \adjsetlength\tc@llx{#4}%
      \@marginbox\collectedbox\tc@llx\tc@llx\tc@llx\tc@llx
      \BOXCONTENT
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@boxframe}[3]{width}{height}{depth}
% Tries to reuse the definition of the \pkg{xcolor} package.
% If it isn't loaded its definition is defined here.
%
% This code was taken from the \pkg{xcolor} package under the free LPPL license.
%    \begin{macrocode}
\let\adjbox@boxframe\boxframe
\providecommand\adjbox@boxframe[3]{%
    \hbox{%
        \dimen@ #2%
        \advance \dimen@ #3\relax
        \lower #3\vbox {%
            \hrule \@height \fboxrule
            \@tempdima -0.5\fboxrule
            \ifodd\fboxrule
                \advance \@tempdima \m@ne sp
            \fi
            \kern \@tempdima
            \hbox {%
                \advance \dimen@ -\fboxrule
                \vrule \@width \fboxrule \@height \dimen@ \@depth \z@
                \@tempdima #1%
                \advance \@tempdima -\tw@ \fboxrule
                \kern \@tempdima
                \vrule \@width \fboxrule \@height \dimen@ \@depth \z@
            }%
            \kern -0.5\fboxrule
            \hrule \@height \fboxrule
        }%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Density keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{dpi}
%    \begin{macrocode}
\define@key\adjbox@fam{dpi}{%
    \adjsetlength\pdfpxdimen{1in/(#1)}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{pxdim}
%    \begin{macrocode}
\define@key\adjbox@fam{pxdim}{%
    \adjsetlength\pdfpxdimen{#1}%
}
%    \end{macrocode}
% \end{key}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Code keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    \begin{macrocode}
\define@key\adjbox@fam{execute}{%
    #1%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key\adjbox@fam{@debug}[]{%
    \showthe\toks@
}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key{ADJBOX}{Execute}{%
    #1%
}
%    \end{macrocode}
%
%
% \begin{key}{adjbox}{addcode}
% Adds code before and after the current boxed content.
% Syntax:~\Key{addcode}'='{<code before>}{<code afterwards>}
%    \begin{macrocode}
\define@key{adjbox}{Addcode}{%
    \adjust@@addcode#1{}\@nnil%
}
\define@key{adjbox}{addcode}{%
    \Gin@esetsize
    \@tempswatrue
    \adjust@@addcode#1{}\@nnil%
}
\long\def\adjust@@addcode#1#2#3\@nnil{%
    \ifx\@nnil#3\@nnil
        \adjust@addcode{#1}{#2}%
    \else
        \PackageError{adjustbox}{Incorrect input for key 'addcode={<code before>}{<code afterwards>}'!}%
    \fi
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{precode}
%    \begin{macrocode}
\define@key{adjbox}{precode}{%
    \Gin@esetsize
    \@tempswatrue
    \adjust@addcode{#1}{}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{Precode}
% Same as \Key{precode} but does not set the size yet.
%    \begin{macrocode}
\define@key{adjbox}{Precode}{%
    \adjust@addcode{#1}{}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{appcode}
%    \begin{macrocode}
\define@key{adjbox}{appcode}{%
    \toks@\expandafter{\the\toks@#1}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjust@addcode}
%    \begin{macrocode}
\long\def\adjust@addcode#1#2{%
    \def\@tempa{#1}%
    \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}#2}%
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{env}
% Adds environment around boxed content
%    \begin{macrocode}
\define@key\adjbox@fam{env}{%
    \@ifnextchar\bgroup{%
        \adjbox@addenv
    }{%
        \adjbox@addenv{#1}\@nnil%
        \remove@to@nnil
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjust@addenv}
%    \begin{macrocode}
\def\adjbox@addenv#1#2\@nnil{%
    \def\@tempa{\begin{#1}#2}%
    \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\the\toks@\end{#1}}%
}%
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Background keys and macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{ADJBOX}{color}
% Sets the foreground color, i.e.\ the color used for the content.
% |#1| are the argument to color, i.e. either \MacroArgs<color>
% or \MacroArgs{<model>}{<color>}.
%    \begin{macrocode}
\define@key{ADJBOX}{color}{%
    \adjbox@checkcolor
    \@ifnextchar\bgroup{%
        \adjbox@color
    }{%
        \adjbox@color{}{#1}%
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@color}
% Check for the optional color argument.
%    \begin{macrocode}
\def\adjbox@color#1#2#3\@nnil{%
    \ifx\@nnil#1\@nnil
        \color{#2}%
    \else
        \color[{#1}]{#2}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{key}{ADJBOX}{color*}
% Sets the color using a given color command.
%    \begin{macrocode}
\define@key{ADJBOX}{color*}{%
    #1%
}
%    \end{macrocode}
% \end{key}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{fgcolor}
% Changes the foreground color.
% |#1| are the argument to color, i.e. either \MacroArgs<color>
% or \MacroArgs{<model>}{<color>}.
%    \begin{macrocode}
\define@key{ADJBOX}{fgcolor}{%
    \adjbox@checkcolor
    \@ifnextchar\bgroup{%
        \adjbox@fgcolor
    }{%
        \adjbox@fgcolor{}{#1}%
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@fgcolor}
% Parses the two possible arguments and adds the color macro
% to the token register.
%    \begin{macrocode}
\def\adjbox@fgcolor#1#2#3\@nnil{%
    \ifx\@nnil#1\@nnil
        \adjbox@innercode{\color{#2}}{}%
    \else
        \adjbox@innercode{\color[{#1}]{#2}}{}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{key}{adjbox}{fgcolor*}
% Adds a colored box in the background. It awaits a direct color macro,
% which gives the user more flexibility.
%    \begin{macrocode}
\define@key{ADJBOX}{fgcolor*}{%
    \adjbox@checkcolor
    \adjbox@innercode{#1}{}%
}
%    \end{macrocode}
% \end{key}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{bgcolor}
% Adds a colored box in the background.
% |#1| are the argument to color, i.e. either \MacroArgs<color>
% or \MacroArgs{<model>}{<color>}.
%    \begin{macrocode}
\define@key\adjbox@fam{bgcolor}{%
    \adjbox@checkcolor
    \@ifnextchar\bgroup{%
        \adjbox@bgcolor
    }{%
        \adjbox@bgcolor{}{#1}%
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@bgcolor}
% Parses the two possible arguments and adds the background color macro
% to the token register.
%    \begin{macrocode}
\def\adjbox@bgcolor#1#2#3\@nnil{%
    \ifx\@nnil#1\@nnil
        \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{\color{#2}}}}%
    \else
        \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{\color[#1]{#2}}}}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{bgcolor*}
% Adds a colored box in the background. It awaits a direct color macro,
% which gives the user more flexibility.
%    \begin{macrocode}
\define@key\adjbox@fam{bgcolor*}{%
    \adjbox@checkcolor
    \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{#1}}}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\@bgcolorbox}
% This places a colored box (vrule) with the same dimensions than
% the content, then compensates for the horizontal shift and places
% the content. This is simpler and more direct than using \Macro\rlap
% or a box macro from the \pkg{xcolor} package.
%
% The argument contains the color macro, e.g.\ \Macro\color{<color>}.
%    \begin{macrocode}
\def\@bgcolorbox#1{%
    \leavevmode
    \hbox{%
        \hbox{%
            #1%
            \vrule\@width\width\@height\height\@depth\depth%
        }%
        \hskip-\width
        \BOXCONTENT
    }%
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\bgcolorbox}
%    \begin{macrocode}
\expandafter\newcommand\expandafter\bgcolorbox\expandafter{%
    \expandafter
    \@ifstar
        \csname bgcolorbox*\endcsname
        \bgcolorbox@
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\bgcolorbox@}
%    \begin{macrocode}
\newcommand\bgcolorbox@[2][\@nnil]{%
    \collectboxcheckenv{bgcolorbox}%
    \ifx\@nnil#1\relax
        \expandafter\@firstoftwo
    \else
        \expandafter\@secondoftwo
    \fi
    {\@collectbox{\@bgcolorbox{\color{#2}}}}%
    {\@collectbox{\@bgcolorbox{\color[#1]{#2}}}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{bgcolorbox*}
%    \begin{macrocode}
\@namedef{bgcolorbox*}#1{%
    \collectboxcheckenv{bgcolorbox*}%
    \@collectbox{\@bgcolorbox{#1}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\fgimagebox}
%    \begin{macrocode}
\expandafter\newcommand\expandafter\fgimagebox\expandafter{%
    \expandafter
    \@ifstar
        \csname fgimagebox*\endcsname
        \fgimagebox@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fgimagebox@}
%    \begin{macrocode}
\newcommand\fgimagebox@[2][]{%
    \collectboxcheckenv{fgimagebox}%
    \@collectbox{\@foregroundbox\adjustimage{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{fgimagebox*}
%    \begin{macrocode}
\expandafter\newcommand\csname fgimagebox*\endcsname[2][]{%
    \collectboxcheckenv{fgimagebox*}%
    \@collectbox{\@foregroundbox\adjustimage{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{key}{adjbox}{fgimage}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{fgimage}{%
    \@ifnextchar\bgroup{%
        \adjbox@fgimage
    }{%
        \adjbox@fgimage{}{#1}%
    }#1{}\@nnil
    {,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{fgimage*}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{fgimage*}{%
    \@ifnextchar\bgroup{%
        \adjbox@fgimage
    }{%
        \adjbox@fgimage{}{#1}%
    }#1{}\@nnil{}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@fgimage}
%    \begin{macrocode}
\def\adjbox@fgimage#1#2#3\@nnil#4{%
    \adjbox@Gin@Add{\@Collectbox{\@foregroundbox\adjustimage{#1#4}{#2}}}%
}
%    \end{macrocode}
% \end{macro}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\bgimagebox}
%    \begin{macrocode}
\expandafter\newcommand\expandafter\bgimagebox\expandafter{%
    \expandafter
    \@ifstar
        \csname bgimagebox*\endcsname
        \bgimagebox@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bgimagebox@}
%    \begin{macrocode}
\newcommand\bgimagebox@[2][]{%
    \collectboxcheckenv{bgimagebox}%
    \@collectbox{\@backgroundbox\adjustimage{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{bgimagebox*}
%    \begin{macrocode}
\expandafter\newcommand\csname bgimagebox*\endcsname[2][]{%
    \collectboxcheckenv{bgimagebox*}%
    \@collectbox{\@backgroundbox\adjustimage{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{key}{adjbox}{bgimage}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{bgimage}{%
    \@ifnextchar\bgroup{%
        \adjbox@bgimage
    }{%
        \adjbox@bgimage{}{#1}%
    }#1{}\@nnil
    {,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{bgimage*}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{bgimage*}{%
    \@ifnextchar\bgroup{%
        \adjbox@bgimage
    }{%
        \adjbox@bgimage{}{#1}%
    }#1{}\@nnil{}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@bgimage}
%    \begin{macrocode}
\def\adjbox@bgimage#1#2#3\@nnil#4{%
    \adjbox@Gin@Add{\@Collectbox{\@backgroundbox\adjustimage{#1#4}{#2}}}%
}
%    \end{macrocode}
% \end{macro}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{foreground}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{foreground}{%
    \@ifnextchar\bgroup{%
        \adjbox@foreground
    }{%
        \adjbox@foreground{}{#1}%
    }#1{}{}\@nnil
    {,width=\pwidth,totalheight=\ptotalheight,raise=\depth-\pdepth}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{foreground*}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{foreground*}{%
    \@ifnextchar\bgroup{%
        \adjbox@foreground
    }{%
        \adjbox@foreground{}{#1}%
    }#1{}{}\@nnil{}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@foreground}
%    \begin{macrocode}
\def\adjbox@foreground#1#2#3\@nnil#4{%
    \adjbox@Gin@Add{\@Collectbox{\@foregroundbox\adjustbox{#1#4}{#2}}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@foregroundbox}
%    \begin{macrocode}
\def\@foregroundbox#1#2#3{%
    \leavevmode
    \hbox to \width{%
        \BOXCONTENT
        \hskip-\width
        \hss
        \adjbox@parentdims
        #1{#2}{#3}%
        \hss
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\foregroundbox}
%    \begin{macrocode}
\expandafter\newcommand\expandafter\foregroundbox\expandafter{%
    \expandafter
    \@ifstar
        \csname foregroundbox*\endcsname
        \foregroundbox@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\foregroundbox@}
%    \begin{macrocode}
\newcommand\foregroundbox@[2][]{%
    \collectboxcheckenv{foregroundbox}%
    \@collectbox{\@foregroundbox\adjustbox{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{foregroundbox*}
%    \begin{macrocode}
\expandafter\newcommand\csname foregroundbox*\endcsname[2][]{%
    \collectboxcheckenv{foregroundbox*}%
    \@collectbox{\@foregroundbox\adjustbox{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{background}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{background}{%
    \@ifnextchar\bgroup{%
        \adjbox@background
    }{%
        \adjbox@background{}{#1}%
    }#1{}{}\@nnil
    {,width=\pwidth,totalheight=\ptotalheight,raise=\depth-\pdepth}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{background*}
% One or two arguments, the first optional one are further \Macro\includegraphics keys.
%    \begin{macrocode}
\define@key{adjbox}{background*}{%
    \@ifnextchar\bgroup{%
        \adjbox@background
    }{%
        \adjbox@background{}{#1}%
    }#1{}{}\@nnil{}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@background}
%    \begin{macrocode}
\def\adjbox@background#1#2#3\@nnil#4{%
    \adjbox@Gin@Add{\@Collectbox{\@backgroundbox\adjustbox{#1#4}{#2}}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@backgroundbox}
%    \begin{macrocode}
\def\@backgroundbox#1#2#3{%
    \leavevmode
    \hbox to \width{%
        \hss
        \adjbox@parentdims
        #1{#2}{#3}%
        \hss
        \hskip-\width%
        \BOXCONTENT
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\backgroundbox}
%    \begin{macrocode}
\expandafter\newcommand\expandafter\backgroundbox\expandafter{%
    \expandafter
    \@ifstar
        \csname backgroundbox*\endcsname
        \backgroundbox@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\backgroundbox@}
%    \begin{macrocode}
\newcommand\backgroundbox@[2][]{%
    \collectboxcheckenv{backgroundbox}%
    \@collectbox{\@backgroundbox\adjustbox{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{backgroundbox*}
%    \begin{macrocode}
\expandafter\newcommand\csname backgroundbox*\endcsname[2][]{%
    \collectboxcheckenv{backgroundbox*}%
    \@collectbox{\@backgroundbox\adjustbox{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Lapping keys and macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{lap}
%    \begin{macrocode}
\define@key\adjbox@fam{lap}{%
    \@ifnextchar\bgroup{%
        \adjbox@lapbox
    }{%
        \adjbox@lapbox{#1}{}%
    }#1{}{}\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@lapbox}
%    \begin{macrocode}
\def\adjbox@lapbox#1#2#3\@nnil{%
    \ifx\@nnil#2\@nnil
        \adjbox@Gin@Add{\lapbox{#1}}%
    \else
        \adjbox@Gin@Add{\lapbox[{#1}]{#2}}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{rlap}
%    \begin{macrocode}
\define@key\adjbox@fam{rlap}[]{%
    \adjbox@Gin@Add{\lapbox{\width}}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{llap}
%    \begin{macrocode}
\define@key\adjbox@fam{llap}[]{%
    \adjbox@Gin@Add{\lapbox{-\width}}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{clap}
%    \begin{macrocode}
\define@key\adjbox@fam{clap}[]{%
    \adjbox@Gin@Add{\lapbox[0pt]{-0.5\width}}%
}
%    \end{macrocode}
% \end{key}%
%
% \begin{macro}{\lapbox}
%    \begin{macrocode}
\newcommand*\lapbox[2][\width-\@tempdimb]{%
    \collectboxcheckenv{lapbox}%
    \@collectbox{\@lapbox{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@lapbox}
%    \begin{macrocode}
\def\@lapbox#1#2{%
    \adjsetlength\@tempdima{#2}%
    \ifdim\@tempdima<\z@
        \@tempdimb=-\@tempdima
    \else
        \@tempdimb=\@tempdima
    \fi
    \adjsetlength\@tempdimc{#1}%
    \ifdim\@tempdimc<\z@
        \@tempdimc=\z@
    \fi
    \leavevmode
    \ifdim\@tempdima<\z@
        \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdimb{\usebox\collectedbox\hss}\hskip\@tempdimc}%
    \else
        \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdimb{\hss\usebox\collectedbox}\hss}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Keys for minibox and varwidth} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{ADJBOX}{minipage}
%    \begin{macrocode}
\define@key{ADJBOX}{minipage}{%
    \adjbox@page{minipage}{#1}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{ADJBOX}{varwidth}
%    \begin{macrocode}
\define@key{ADJBOX}{varwidth}{%
    \adjbox@page{varwidth}{#1}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@page}
% If the value starts with "[" or "{" take the value as it is,
% otherwise assume that is a single length expression and add the required "{ }".
%    \begin{macrocode}
\def\adjbox@page#1#2{%
    \@ifnextchar[{%
        \adjbox@@page{#1}%
    }{%
        \@ifnextchar\bgroup{%
            \adjbox@@page{#1}%
        }{%
            \adjbox@@page{#1}{{#2}}\@nnil%
            \remove@to@nnil
        }%
    }#2\@nnil
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@@page}
% Sets collect-box command to use \env{minipage} or similar environment.
%
% The \Macro\setlength macro is change temporary for the \env{minipage} or \env{varwidth} environment.
%    \begin{macrocode}
\def\adjbox@@page#1#2\@nnil{%
    \adjbox@innercode
        {\adjbox@set\begin{#1}#2\adjbox@reset\ignorespaces}%
        {\end{#1}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@set}
% Sets \Macro\setlength to \pkg{adjcalc} version.
%    \begin{macrocode}
\def\adjbox@set{%
    \let\adjbox@origsetlength\setlength
    \def\setlength{\adjsetlength}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@reset}
% Resets \Macro\setlength to normal version.
%    \begin{macrocode}
\def\adjbox@reset{%
    \let\setlength\adjbox@origsetlength
}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Stackbox keys and macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{macro}{\stackbox}
%    \begin{macrocode}
\newcommand*\stackbox[1][c]{%
    \collectboxcheckenv{stackbox}%
    \@ifnextchar[%]
        {\@stackbox{#1}}%
        {\@@stackbox{#1}{b}[]}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@stackbox}
% Read the third optional argument
%    \begin{macrocode}
\def\@stackbox#1[#2]{%
    \@testopt{\@@stackbox{#1}{#2}}{}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@stackbox}
% The \env{varwidth} environment is used because it is much simpler to use than \env{tabular}.
% The horizontal alignment is done by the usual text align macros.
%    \begin{macrocode}
\def\@@stackbox#1#2[#3]{%
    \collectbox@
        {\begin{varwidth}[#2]{\linewidth}\csname adjbox@halign@#1\endcsname#3\ignorespaces}
        \BOXCONTENT
        {\end{varwidth}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@halign@c}
% \begin{macro}{\adjbox@halign@l}
% \begin{macro}{\adjbox@halign@r}
% \begin{macro}{\adjbox@halign@j}
% Horizontal alignment macros.
%    \begin{macrocode}
\def\adjbox@halign@c{\centering}
\def\adjbox@halign@l{\raggedright}
\def\adjbox@halign@r{\raggedleft}
\def\adjbox@halign@j{\let\\\newline}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{key}{ADJBOX}{stack}
%    \begin{macrocode}
\define@key{ADJBOX}{stack}[{}{}{}]{%
    \adjbox@stack#1{}{}{}\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@stack}
%    \begin{macrocode}
\def\adjbox@stack#1#2#3#4\@nnil{%
    \ifx\@nnil#1\@nnil
        \adjbox@@stack{c}{b}{}%
    \else
    \ifx\@nnil#2\@nnil
        \adjbox@@stack{#1}{b}{}%
    \else
        \adjbox@@stack{#1}{#2}{#3}%
    \fi\fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@@stack}
%    \begin{macrocode}
\def\adjbox@@stack#1#2#3{%
    \adjbox@innercode{%
        \begin{varwidth}[#2]{\linewidth}%
        \csname adjbox@halign@#1\endcsname#3%
        \ignorespaces
    }{%
        \end{varwidth}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% Load the \pkg{varwidth} package if available or disable the dependent keys if not.
%    \begin{macrocode}
\IfFileExists{varwidth.sty}
    {\RequirePackage{varwidth}}{%
    \define@key{ADJBOX}{varwidth}{%
        \PackageError{adjustbox}{The 'varwidth' key requires the 'varwidth' package, which is not installed}{}%
    }
    \define@key{ADJBOX}{stack}{%
        \PackageError{adjustbox}{The 'stack' key requires the 'varwidth' package, which is not installed}{}%
    }
}%
%    \end{macrocode}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{tabular and array keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{key}{ADJBOX}{tabular}
%    \begin{macrocode}
\define@key{ADJBOX}{tabular}{%
    \@ifnextchar[{%
        \adjbox@tabular{tabular}%
    }{%
        \adjbox@tabular{tabular}{{#1}}\@nnil%
        \remove@to@nnil
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@tabular}
%    \begin{macrocode}
\def\adjbox@tabular#1#2\@nnil{%
    \ifcollectboxenv
        \adjbox@innerenv{#1}{#2}\@nnil
    \else
        \def\adjbox@collectbox##1{\collectbox@tab{#1}{#2}{\adjbox@begininnercode}{##1}{\adjbox@endinnercode}}%
    \fi
    \chardef\adjbox@innerlevel\tw@
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{ADJBOX}{tabular*}
%    \begin{macrocode}
\define@key{ADJBOX}{tabular*}{%
    \adjbox@tabular{tabular*}#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{ADJBOX}{array}
%    \begin{macrocode}
\define@key{ADJBOX}{array}{%
    \@ifnextchar[{%
        \adjbox@array%
    }{%
        \adjbox@array{{#1}}\@nnil%
        \remove@to@nnil
    }#1\@nnil
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@array}
%    \begin{macrocode}
\def\adjbox@array#1\@nnil{%
    \ifcollectboxenv
        \adjbox@innercode{\(\begin{array}#1}{\end{array}\)}%
    \else
        \def\adjbox@collectbox##1{\collectbox@tab{array}{#1}{\adjbox@begininnercode\(}{##1}{\)\adjbox@endinnercode}}%
    \fi
    \chardef\adjbox@innerlevel\tw@
}
%    \end{macrocode}
% \end{macro}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Keys for inner environments and code} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% \begin{key}{ADJBOX}{innerenv}
%    \begin{macrocode}
\define@key{ADJBOX}{innerenv}{%
    \@ifnextchar\bgroup{%
        \adjbox@@innerenv
    }{%
        \adjbox@innerenv{#1}\@nnil%
        \remove@to@nnil
    }#1\@nnil
}
\adjbox@let@key{ADJBOX}{inner env}{innerenv}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@innerenv}
%    \begin{macrocode}
\def\adjbox@innerenv#1#2\@nnil{%
    \adjbox@innercode
        {\begin{#1}#2}%
        {\end{#1}}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@innerenv}
% \begin{macro}{\adjbox@@innerenv}
% \begin{macro}{\adjbox@@@innerenv}
% Used to extract the environment arguments. The issue here is that if a single mandatory argument is used
% its braces are removed. To avoid that a `|{}|' is always added beforehand and then removed again.
%    \begin{macrocode}
\def\adjbox@@innerenv#1{%
    \adjbox@@@innerenv{#1}{}%
}%
\def\adjbox@@@innerenv#1#2\@nnil{%
    \expandafter\adjbox@@@@innerenv\expandafter{\@gobble#2}{#1}%
}%
\def\adjbox@@@@innerenv#1#2{%
    \adjbox@innerenv{#2}{#1}\@nnil
}%
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{key}{ADJBOX}{innercode}
%    \begin{macrocode}
\define@key{ADJBOX}{innercode}{%
    \adjbox@innercode#1{}{}%
}%
\adjbox@let@key{ADJBOX}{inner code}{innercode}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@innercode}
%    \begin{macrocode}
\def\adjbox@innercode{%
    \ifcase\adjbox@innerlevel
    \relax% 0: first inner code
        \def\adjbox@collectbox##1{\collectbox@{\adjbox@begininnercode\adjustbox@ignorespaces}{##1}{\adjustbox@unskip\adjbox@endinnercode}}%
        \chardef\adjbox@innerlevel\@ne
        \expandafter\adjbox@@innercode
    \or% 1 append inner code, no inner env
        \expandafter\adjbox@@innercode
    \else% 2 inner tabular exists, create warning and ignore content.
        \PackageWarning{adjustbox}{Further inner code or environment ignored\MessageBreak after "tabular"-like key}%
        \expandafter\@gobbletwo
    \fi
}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@@innercode}
%    \begin{macrocode}
\long\def\adjbox@@innercode#1#2{%
    \@temptokena\expandafter{\adjbox@begininnercode#1}%
    \edef\adjbox@begininnercode{\the\@temptokena}%
    \@temptokena{#2}%
    \@temptokena\expandafter\expandafter\expandafter{\expandafter\the\expandafter\@temptokena\adjbox@endinnercode}%
    \edef\adjbox@endinnercode{\the\@temptokena}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Float keys} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{label}
%    \begin{macrocode}
\define@key\adjbox@fam{label}{%
    \def\adjbox@label{\label{#1}}%
}
\let\adjbox@label\@empty
%    \end{macrocode}
% \end{key}
%
%    \begin{macrocode}
\chardef\adjbox@caption@pos=11
%    \end{macrocode}
%
% \begin{key}{adjbox}{captionabove}
%    \begin{macrocode}
\define@key\adjbox@fam{captionabove}{%
    \chardef\adjbox@caption@pos=1
    \csname KV@\adjbox@fam @caption\endcsname{#1}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{captionbelow}
%    \begin{macrocode}
\define@key\adjbox@fam{captionbelow}{%
    \chardef\adjbox@caption@pos=0
    \csname KV@\adjbox@fam @caption\endcsname{#1}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{caption}
%    \begin{macrocode}
\define@key\adjbox@fam{caption}{%
    \@ifnextchar{[}{%
        \adjbox@def@caption
    }{%
        \adjbox@def@@caption
    }#1\@nnil
}
\def\adjbox@def@@caption#1\@nnil{%
    \def\adjbox@caption{\caption{#1}}%
}
\def\adjbox@def@caption[#1]#2\@nnil{%
    \def\adjbox@caption{\caption[#1]{#2}}%
}
\let\adjbox@caption\@empty
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{figure}
%    \begin{macrocode}
\define@key\adjbox@fam{figure}[]{%
    \let\adjustbox@noindent\relax
    \ifx\@nnil#1\@nnil
        \adjbox@addfloat{figure}{\begin{figure}}{}{\end{figure}}%
    \else
        \adjbox@addfloat{figure}{\begin{figure}}{[{#1}]}{\end{figure}}%
    \fi
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{float}
%    \begin{macrocode}
\define@key\adjbox@fam{float}{%
    \let\adjustbox@noindent\relax
    \@ifnextchar\bgroup{%
        \adjbox@float
    }{%
        \adjbox@float{#1}{}\@nnil
        \remove@to@nnil
    }#1\@nnil
}
\def\adjbox@float#1#2\@nnil{%
    \adjbox@addfloat{#1}{\begin{#1}}{#2}{\end{#1}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{nofloat}
%    \begin{macrocode}
\define@key\adjbox@fam{nofloat}[figure]{%
    \adjbox@addfloat{#1}{\adjnofloat}{{#1}}{\endadjnofloat}%
}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\adjbox@caption@table@pos}
%    \begin{macrocode}
\def\adjbox@caption@table@pos{1}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\adjbox@addfloat}
%    \begin{macrocode}
\def\adjbox@addfloat#1#2#3#4{%
    \Gin@esetsize
    \@tempswatrue
    \ifnum\adjbox@caption@pos>10
        \chardef\adjbox@caption@pos=0\csname adjbox@caption@#1@pos\endcsname\relax
    \fi
    \ifcase\adjbox@caption@pos
        \def\@tempa{\adjust@addcode{#2#3}}%
        \expandafter\expandafter\expandafter\@tempa
        \expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label#4}%
    \else
        \def\@tempa##1{\adjust@addcode{#2#3\adjbox@captionabove##1}}%
        \expandafter\expandafter\expandafter\@tempa
        \expandafter\expandafter\expandafter
        {\expandafter\adjbox@caption\adjbox@label}{#4}%
    \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@captionabove}
%    \begin{macrocode}
\@ifpackageloaded{caption}{%
    \let\adjbox@captionabove\relax
}{%
    \def\adjbox@captionabove{%
        \begingroup
        \edef\@tempa{\endgroup
            \abovecaptionskip=\the\belowcaptionskip\relax
            \belowcaptionskip=\the\abovecaptionskip\relax
        }%
        \@tempa
    }%
    \AtBeginDocument{%
        \@ifpackageloaded{caption}{%
            \global\let\adjbox@captionabove\relax
        }{}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@nofloatenv}
%    \begin{macrocode}
\def\adjbox@nofloatenv{minipage}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\adjbox@nofloatcaptionsetup}
% Calls \Macro\captionsetup from the \pkg{caption} package if defined, otherwise sets \Macro\@captype directly.
% Calls \Macro\capstart from the \pkg{hypcap} package if defined. Both are done to ensure correct hypertargets on top
% of the content and not at the caption position.
%    \begin{macrocode}
\def\adjbox@nofloatcaptionsetup#1{%
    \@ifundefined{captionsetup}%
     {\def\@captype{#1}}%
     {\captionsetup{type={#1}}}%
\csname capstart\endcsname
}
%    \end{macrocode}
% \end{macro}%
%
% \begin{environment}{adjnofloat}
% Environment used for non-floats.
%    \begin{macrocode}
\newenvironment{adjnofloat}[1]{%
    \par\noindent
    \minipage{\linewidth}%
    \adjbox@nofloatcaptionsetup{#1}%
}{%
    \endminipage\par
}
%    \end{macrocode}
% \end{environment}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Change or discard the content} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{phantom}
%    \begin{macrocode}
\define@key\adjbox@fam{phantom}[]{%
    \expandafter\ifx\csname #1phantom\endcsname\relax
        \adjust@addcode{\phantom}{}%
    \else
        \expandafter\adjust@addcode\expandafter{\csname #1phantom\endcsname}{}%
    \fi
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\phantombox}[3]{width}{height}{depth}
% Produces an empty box with the given width, height and depth.
%    \begin{macrocode}
\newcommand*\phantombox[3]{%
    \begingroup
    \adjsetlength\@tempdima{#1}%
    \adjsetlength\@tempdimb{#2}%
    \adjsetlength\@tempdimc{#3}%
    \setbox\collectedbox\hbox{}%
    \wd\collectedbox\@tempdima
    \ht\collectedbox\@tempdimb
    \dp\collectedbox\@tempdimc
    \leavevmode
    \box\collectedbox
    \endgroup
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{gobble}
% Discards the content.
%    \begin{macrocode}
\define@key\adjbox@fam{gobble}[\@nil]{%
    \adjbox@novalue{#1}%
    \let\adjustbox@noindent\relax
    \adjbox@Gin@Add{\@Collectbox{}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{discard}
% Alias of \Key{gobble}.
%    \begin{macrocode}
\adjbox@let@key\adjbox@fam{discard}{gobble}%
%    \end{macrocode}
% \end{key}
%
%
% \begin{key}{adjbox}{content}
% Replaces the content. The old content is still processed completely before being replaced..
%    \begin{macrocode}
\define@adjboxkey{content}{\@Collectbox{#1}}%
%    \end{macrocode}
% \end{key}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Store box content and sizes} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{gstore}
% Store the current content into a box without removing it.
%    \begin{macrocode}
\define@adjboxkey{gstore}{\global\@collectboxto{#1}{\BOXCONTENT}}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore*}
% Store the content into a box only.
%    \begin{macrocode}
\define@key\adjbox@fam{gstore*}{%
    \let\adjustbox@noindent\relax
    \adjbox@Gin@Add{\global\sbox{#1}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore width}
%    \begin{macrocode}
\define@key{adjbox}{gstore width}{%
    \adjbox@Gin@Add{\@Collectbox{\global#1=\width\BOXCONTENT}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore depth}
%    \begin{macrocode}
\define@key{adjbox}{gstore depth}{%
    \adjbox@Gin@Add{\@Collectbox{\global#1=\depth\BOXCONTENT}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore height}
%    \begin{macrocode}
\define@key{adjbox}{gstore height}{%
    \adjbox@Gin@Add{\@Collectbox{\global#1=\height\BOXCONTENT}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore totalheight}
%    \begin{macrocode}
\define@key{adjbox}{gstore totalheight}{%
    \adjbox@Gin@Add{\@Collectbox{\global#1=\totalheight\BOXCONTENT}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{key}{adjbox}{gstore sizes}
%    \begin{macrocode}
\define@key{adjbox}{gstore sizes}{%
    \adjbox@Gin@Add{\@Collectbox{\adjbox@gstore@sizes#1\relax\relax\relax\relax\@nnil\BOXCONTENT}}%
}
%    \end{macrocode}
% \end{key}
%
% \begin{macro}{\adjbox@gstore@sizes}[4]{width register}{height register}{depth register}{totalheight register}
% Stores the width, height, depth and totalheight in the given registers if they are not empty (or \Macro\relax).
%    \begin{macrocode}
\def\adjbox@gstore@sizes#1#2#3#4#5\@nnil{%
    \ifx\relax#1\relax\else
        \global#1=\width
    \fi
    \ifx\relax#2\relax\else
        \global#2=\height
    \fi
    \ifx\relax#3\relax\else
        \global#3=\depth
    \fi
    \ifx\relax#4\relax\else
        \global#4=\totalheight
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Experimental split and pagebreak keys and macros} ^^A (((
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    \begin{macrocode}
%%\RequirePackage{storebox}
%    \end{macrocode}
%
% \begin{macro}{\splitbox}
%    \begin{macrocode}
\newcommand\splitbox[2]{%
    \collectboxcheckenv{splitbox}%
    \@collectbox{\@splitbox{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{key}{adjbox}{split}
%    \begin{macrocode}
\define@adjboxkey{split}{\@Collectbox{\@splitbox#1}}
%    \end{macrocode}
% \end{key}
%
%
% \begin{macro}{\@splitbox}
%    \begin{macrocode}
\def\@splitbox#1#2{%
    \ifstorebox
        \storebox\splittedbox{\BOXCONTENT}%
        \setbox\collectedbox\hbox{\usestorebox\splittedbox}%
    \fi
    \xdef\@tempa{#1}%
    \xdef\@tempb{#2}%
    \ifx\@tempa\Gin@exclamation
        \@tempdima\maxdimen
    \else
        \adjsetlength\@tempdima\@tempa
    \fi
    \ifx\@tempb\Gin@exclamation
        \Gin@nat@height\maxdimen
    \else
        \adjsetlength\Gin@nat@height\@tempb
    \fi
    \ifdim\@tempdima>\width
        \@tempdima\width
    \fi
    \ifdim\Gin@nat@height>\totalheight
        \Gin@nat@height\totalheight
    \fi
    \tc@llx\z@
    \tc@lly\totalheight
    \tc@urx\width
    \tc@ury\z@
    \advance\tc@lly-\Gin@nat@height
    \@@splitbox
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@splitbox}
%    \begin{macrocode}
\def\@@splitbox{%
    \advance\tc@urx-\@tempdima
    \@@@splitbox
    \ifdim\tc@urx>\z@
        \advance\tc@llx+\@tempdima
        \expandafter\@@splitbox
    \else
        \ifdim\tc@lly<\splitbox@epsilon
            \splitboxlastnewline
        \else
            \splitboxnewline
            \tc@llx\z@
            \tc@urx\width
            \advance\tc@lly-\Gin@nat@height
            \advance\tc@ury+\Gin@nat@height
            \expandafter\expandafter
            \expandafter\@@splitbox
        \fi
    \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@@splitbox}
%    \begin{macrocode}
\def\@@@splitbox{%
    \begingroup
    \setbox\collectedbox=\copy\collectedbox
    \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury
    \splitboxcmd{\usebox\collectedbox}%
    \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@@splitbox}
%    \begin{macrocode}
\def\@@@splitbox{%
    \begingroup
    \setbox\collectedbox=\copy\collectedbox
    \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury
    \splitboxcmd{\usebox\collectedbox}%
    \endgroup
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\splitboxcmd}
%    \begin{macrocode}
\let\splitboxcmd\empty
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\splitboxnewline}
%    \begin{macrocode}
\newcommand\splitboxnewline{\\}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\splitboxlastnewline}
%    \begin{macrocode}
\newcommand\splitboxlastnewline{\splitboxnewline}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\splitbox@epsilon}
%    \begin{macrocode}
\def\splitbox@epsilon{100sp}
%    \end{macrocode}
% \end{macro}
%
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\pagebreakbox}
%    \begin{macrocode}
\newcommand\pagebreakbox{%
    \par\noindent
    \collectboxcheckenv{pagebreakbox}%
    \@collectbox{\@pagebreakbox}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{key}{adjbox}{pagebreak}
%    \begin{macrocode}
\define@key\adjbox@fam{pagebreak}[]{%
    \adjbox@Gin@Add{\@Collectbox{\@pagebreakbox}}%
}
%    \end{macrocode}
% \end{key}
%
%
%
% \begin{macro}{\@pagebreakbox}
% Used internal macros:
%
% \begin{tabular}{ll}
%   \Macro\@tempa      & Caption code \\
%   \Macro\@tempboxa   & Caption box  \\
%   \Macro\tc@lly & Lower clip amount \\
%   \Macro\tc@ury & Lower clip amount \\
% \end{tabular}
%    \begin{macrocode}
\def\@pagebreakbox{%
    \sbox\collectedbox{\raise\dp\collectedbox\hbox{\BOXCONTENT}}%
    \ifstorebox
        \storebox\splittedbox{\BOXCONTENT}%
        \setbox\collectedbox\hbox{\usestorebox\splittedbox}%
    \fi
    \adjsetlength\tc@lly
        {\totalheight-\pagegoal+\pagetotal+\pagebreakboxoffset}%
    \ifdim\tc@lly>\z@
        \begingroup
        \setbox\collectedbox=\copy\collectedbox
        \@clipbox\collectedbox\z@\tc@lly\z@\z@
        \BOXCONTENT
        \endgroup
        \par\noindent
        \adjsetlength\tc@ury{\totalheight-\tc@lly}%
        \ifdim\tc@lly>\textheight
            \loop
                \advance\tc@lly-\textheight
                \begingroup
                \setbox\collectedbox=\copy\collectedbox
                \@clipbox\collectedbox\z@\tc@lly\z@\tc@ury
                \BOXCONTENT
                \endgroup
                \advance\tc@ury\textheight
                \par\noindent
                \ifdim\tc@lly>\textheight
            \repeat
            \@clipbox\collectedbox\z@\z@\z@\tc@ury
            \BOXCONTENT
        \else
            \@clipbox\collectedbox\z@\z@\z@\tc@ury
            \par\noindent
            \BOXCONTENT
        \fi
    \else
        \BOXCONTENT%
    \fi
    \par
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\pagebreakboxoffset}
%    \begin{macrocode}
\newcommand*\pagebreakboxoffset{\ht\strutbox}
%    \end{macrocode}
% \end{macro}
%
%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vim: foldenable foldmethod=marker foldmarker=(((,)))
% \iffalse
%</adjustbox.sty>
% \fi
%
% ^^A )))
% \Finale
% \endinput
% ^^A vim: foldenable foldmethod=marker foldmarker=(((,)))
