summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/adjustbox
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/adjustbox
Initial commit
Diffstat (limited to 'macros/latex/contrib/adjustbox')
-rw-r--r--macros/latex/contrib/adjustbox/README26
-rw-r--r--macros/latex/contrib/adjustbox/adjcalc.dtx426
-rw-r--r--macros/latex/contrib/adjustbox/adjcalc.pdfbin0 -> 152773 bytes
-rw-r--r--macros/latex/contrib/adjustbox/adjustbox.dtx6203
-rw-r--r--macros/latex/contrib/adjustbox/adjustbox.ins23
-rw-r--r--macros/latex/contrib/adjustbox/adjustbox.pdfbin0 -> 380505 bytes
-rw-r--r--macros/latex/contrib/adjustbox/trimclip.dtx2351
-rw-r--r--macros/latex/contrib/adjustbox/trimclip.pdfbin0 -> 213356 bytes
8 files changed, 9029 insertions, 0 deletions
diff --git a/macros/latex/contrib/adjustbox/README b/macros/latex/contrib/adjustbox/README
new file mode 100644
index 0000000000..fb560d38ef
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/README
@@ -0,0 +1,26 @@
+LaTeX bundle adjustbox
+========================
+Copyright (c) 2011-2019 by Martin Scharrer <martin@scharrer-online.de>
+WWW: <https://bitbucket.org/martin_scharrer/adjustbox> (incl. bug tracker)
+
+This bundle contains the the adjustbox package and its auxiliary packages trimclip and adjcalc.
+The initial purpose of adjustbox was to supplement the standard graphics/x package,
+which defines the macros \resizebox, \scalebox and \rotatebox, with the macros \trimbox and \clipbox.
+An additional \marginbox macro is also provided.
+These macros are now placed in the dedicated package trimclip which is loaded by adjustbox.
+The package comes with clipping driver files are provided for pdftex (incl. LuaLaTeX), dvips and xetex. A
+fall-back driver which uses the pgf package is still included.
+The driver files got written by Joseph Wright (LaTeX3 project) and the package author.
+
+The main feature of adjustbox is the general \adjustbox macro which extends the key=value
+interface of \includegraphics from the graphicx package, and applies it to general text
+content. It also provides further text/box modifications keys, macros and envionments.
+
+Both adjustbox and trimclip use the adjcalc package to allow for algebraic expressions for all length
+arguments. The adjcalc package can use either e-TeX, the calc package or the pgfmath package.
+
+All macros use the authors other package collectbox to read the content as box and not as
+macro argument. This allows for all forms of content including special material like verbatim content.
+A special feature of collectbox is used to provide matching environments with the identical names as the
+macros.
+
diff --git a/macros/latex/contrib/adjustbox/adjcalc.dtx b/macros/latex/contrib/adjustbox/adjcalc.dtx
new file mode 100644
index 0000000000..318bda128f
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/adjcalc.dtx
@@ -0,0 +1,426 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011-2018 by Martin Scharrer <martin@scharrer-online.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 adjcalc.dtx, adjustbox.ins
+%% and the derived file adjcalc.sty.
+%% It is part of the larger adjustbox bundle.
+%%
+%<=/COPYRIGHT>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{adjcalc.dtx}[%
+%<=*DATE>
+ 2012/05/16
+%<=/DATE>
+%<=*VERSION>
+ v1.1
+%<=/VERSION>
+ DTX file for the adjcalc package]
+\documentclass[a4paper]{ydoc}[2011/11/16]
+\usepackage{amsmath}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{fourier}
+\usepackage{newverbs}
+\MakeSpecialShortVerb\qverb\"
+%\AtBeginDocument{\MakeShortMacroArgs\`\relax}
+%\AtEndDocument{\DeleteShortVerb\`}
+\GetFileInfo{adjcalc.dtx}
+\usepackage{adjcalc}[\filedate]
+\usepackage{tikz}
+\normalmarginpar
+
+
+%\EnableCrossrefs
+%\CodelineIndex
+%\RecordChanges
+\OnlyDescription
+\begin{document}
+ \DocInput{\jobname.dtx}
+ \PrintChanges
+ %\newpage\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{274}
+%
+% \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{v1.0}{2011/11/16}{First version after extraction from \pkg{adjustbox} package.}
+% \changes{v1.1}{2012/05/16}{Better separation from the \pkg{adjustbox} package. Added own manual.}
+%
+% \GetFileInfo{adjcalc.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let}
+% \bundle{adjustbox}
+% \author{Martin Scharrer}
+% \email{martin@scharrer-online.de}
+% \ydocpdfsettings
+% \maketitle
+%
+% \begin{abstract}
+% This package provides macros to assign or to add algebraic expressions to \LaTeX lengths and counters.
+% It either uses $\epsilon$-\TeX, the \pkg{calc} package or the \pkg{pgfmath} package internally to achieve this.
+% This package is part of the \pkg{adjustbox} bundle and was originally part of the \pkg{adjustbox} package before
+% it was extracted to a dedicated package.
+% \end{abstract}
+%
+% \section{Introduction}
+% \LaTeX\ lengths and counters can be set using \Macro\setlength and \Macro\setcounter,
+% and values can be added to these using \Macro\addtoclength and \Macro\addtocounter, respectively.
+% By default these macros await a single length or integer value to be assigned or added.
+% However, often it is beneficial to use a short algebraic expression, like a sum of two values, instead.
+% The \pkg{calc} package was created for this and redefines the above macros to parse the given expression.
+% Another possibility is to use $\epsilon$-\TeX's \Macro\dimexpr or \Macro\glueexpr which also allows for
+% several algebraic operations and is more efficient than the higher-level \pkg{calc} package.
+% Finally PGF/TikZ provides a large math engine with the \pkg{pgfmath} package. It allows even
+% for complicated functions like $\log$ or $\sin$. However, \pkg{pgfmath} is rather large, especially because
+% with PGF v2.10 it cannot be loaded on its own due to a bug, which forces the whole \pkg{pgf} package to be loaded.
+%
+% Package authors which like to write macros which allow algebraic expressions for its length arguments
+% now face the dilemma which math interface they should use. Either they exclude users which do not have an
+% $\epsilon$-TeX distribution (even if they are very rare) or require to load a large package.
+% This was the case with the \pkg{adjustbox} package and therefore own wrapper macros were used instead which
+% will use one of the different math engine mentioned above.
+% Because this functionality was deemed useful for other packages of the same and other authors it was
+% extracted into the dedicated package \pkg{adjcalc}. The idea is that the user can choose the used math engine
+% using package options.
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Package Options}\label{sec:options} ^^A (((
+% The following options define the way length values are processed by the provided macros.
+% The first group can be either used as package options and as local setting using \Macro\adjcalcset or as keys
+% for \Macro\adjustbox or the \env{adjustbox} environment (but not for \Macro\includegraphics even if the \opt{export}
+% option of \pkg{adjustbox} was used).
+% The only difference between using them as package options or keys is that as package option they also load required packages.
+% Therefore all keys used in the document should be used as package options first or the required packages must be loaded
+% manually.
+%
+% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
+% \oitem{etex} Uses the $\epsilon$-\TeX\ primitive \Macro\glueexpr to parse length values. This allows for additions,
+% subtractions as well as multiplications and devision by a numeric factor. See the official \pkg{etex\_man} document
+% for more details. This setting is the default if $\epsilon$-\TeX\ is detected (which should be the case with all
+% modern \LaTeX\ distributions).
+% \oitem{calc} Uses the \pkg{calc} package to parse length values. It supports all operations mentioned for \opt{etex} and
+% also some other operation like \Macro\widthof{<text>}.
+% See the \pkg{calc} package manual for more details.
+% This is the default setting if $\epsilon$-TeX is not detected.
+% \oitem{pgfmath} Uses the \pkg{pgfmath} package of the \pkg{pgf} bundle to parse length values. It supports all basic
+% numeric operations and also advanced mathematical functions.
+% See the \pkg{pgf} manual for more details.
+% Because the \pkg{pgfmath} package can't be loaded
+% independently in the current version (v2.10) the whole \pkg{pgf} package will be loaded.
+% \oitem{overwrite} This option will overwrite the standard macros with the macros of this package.
+% This e.g.\ sets \Macro\setlength to be identical to \Macro\adjsetlength.
+% Any package option used after \opt{overwrite} will still take affect before the redefinition,
+% i.e.\ the order in which \opt{overwrite} is used is not meaningful.
+% \oitem{defaultunit}\MacroArgs!{\hspace*{-1ex}}!'='<unit>\relax
+% This sets the default unit used for macros and keys which allow for unit-less values,
+% e.g.\ the \Key{trim} key of \Macro\adjustbox or the \Macro\trimbox macro of the \pkg{trimclip} package.
+% The standard default unit is the same as for \Macro\includegraphics: "bp" (big points, PostScript points).
+% However, for \LaTeX\ material \TeX\ normal unit "pt" (\TeX\ points) are better suited and will avoid rounding
+% errors which otherwise get introduced by the internal conversion.
+% The default unit is only used if the particular value is only a single number without unit,
+% but not if any mathematical operations are used.
+% If the special value |none| is used no default unit is applied and the internal check if the value is a single number
+% is by-passed. This gives a small speed bonus and can be used to avoid potential issues with complex values.
+% At this moment this setting will disable the default unit feature for the rest of the current group (i.e.\ all
+% further \Macro\adjustbox keys or globally if used as a package option) and further usages of this option will
+% have no affect. This might change in future versions of this package.
+% \end{description}
+%
+% \noindent
+% The following option can only be used as package option:
+% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
+% \oitem{none} Disables the features of this package and makes all macros use the normal \LaTeX\ equivalents,
+% e.g.\ \Macro\adjsetlength will expand to \Macro\setlength, etc.
+% This option also disables any previous set option as well as any future use of \opt{overwrite}.
+% \end{description}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Macros}
+%
+% \DescribeMacro\adjcalcset{<key=value, \ldots>}
+% This configuration macro allows to change the above mentioned options during the document.
+% Any changes are only locally to the current group/environment.
+% Please see the descriptions of the options for any limitations.
+%
+%
+% \DescribeMacro\adjsetlength{<\textbackslash lengthmacro>}{<length expression>}
+% \DescribeMacro\adjaddtolength{<\textbackslash lengthmacro>}{<length expression>}
+% \DescribeMacro\adjsetcounter{<counter name>}{<integer expression>}
+% \DescribeMacro\adjaddtocounter{<counter name>}{<integer expression>}
+% These macros can be used to set and add to \LaTeX\ length registers and counters like with the normal
+% macros \Macro\setlength, \Macro\addtolength, \Macro\setcounter and \Macro\addtocounter.
+% However, these macros allow the use of algebraic expressions, like sums and multiplications, while
+% the standard macros only await a single value.
+%
+%
+% \DescribeMacro\adjsetlengthdefault{<\textbackslash lengthmacro>}{<length expression with or without unit>}
+% This macro set the length macro but does also support length values without an explicit unit.
+% If no unit is used the default unit set by the \opt{defaultunit} option is used. The initial default unit
+% is `|bp|' (big points, i.e.\ PostScript/PDF points, 72bp=1inch).
+%
+%
+% \StopEventually{}
+% \clearpage
+% \section{Implementation}
+%
+% \iffalse
+%<*adjcalc.sty>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesPackage{adjcalc}[%
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Provides advanced setlength with multiple back-ends (calc, etex, pgfmath)]
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+%
+%
+% Use e-TeX by default if available, otherwise the \pkg{calc} package.
+% \begin{macrocode}
+\def\adjcalc@atend{%
+\begingroup
+\expandafter\ifx\csname glueexpr\endcsname\relax
+ \endgroup
+ \RequirePackage{calc}%
+ \adjcalc@calc
+ \def\adjcalc@etex{\PackageError{adjcalc}{e-TeX not available for current compiler!}}%
+\else
+ \endgroup
+ \adjcalc@etex
+\fi
+}
+% \end{macrocode}
+%
+% Initial definitions for the package options. This macros are later redefined because the same keys
+% can be used as macro options.
+% \begin{macrocode}
+\def\adjcalc@pgfmath{\AtEndOfPackage{\RequirePackage{pgf}}\def\adjcalc@atend{\adjcalc@pgfmath}}
+\def\adjcalc@etex{\def\adjcalc@atend{\adjcalc@etex}}
+\def\adjcalc@calc{\AtEndOfPackage{\RequirePackage{calc}}\def\adjcalc@atend{\adjcalc@calc}}
+\def\adjcalc@overwrite{\AtEndOfPackage{\adjcalc@overwrite}}
+% \end{macrocode}
+%
+% The initial default unit is `|bp|' like for \pkg{graphicx}.
+% \begin{macrocode}
+\def\adjcalc@defaultunit{bp}%
+% \end{macrocode}
+%
+%
+% Options:
+% \begin{macrocode}
+\DeclareOptionX<adjcalc>{pgfmath}{\adjcalc@pgfmath}
+\DeclareOptionX<adjcalc>{etex}{\adjcalc@etex}
+\DeclareOptionX<adjcalc>{calc}{\adjcalc@calc}
+\DeclareOptionX<adjcalc>{none}{%
+ \let\adjcalc@atend\relax
+ \let\adjcalc@overwrite\relax
+ \def\adjsetlength{\setlength}%
+ \def\adjaddtolength{\addtolength}%
+ \def\adjsetcounter{\setcounter}%
+ \def\adjaddtocounter{\addtocounter}%
+}
+\DeclareOptionX<adjcalc>{overwrite}{\adjcalc@overwrite}
+\DeclareOptionX<adjcalc>{defaultunit}[bp]{%
+ \begingroup
+ \def\@tempa{#1}%
+ \def\@tempb{none}%
+ \ifx\@tempa\@tempb% 'none':
+ \endgroup
+ \def\adjsetlengthdefault{\adjsetlength}%
+ \else
+ \ifx\@tempb\adjcalc@defaultunit
+ \endgroup
+ % was 'none' before
+ \let\adjsetlengthdefault\adjsetlengthdefault@
+ \else
+ \endgroup
+ \fi
+ \fi
+ \def\adjcalc@defaultunit{#1}%
+}
+\ProcessOptionsX*<adjcalc>
+\disable@keys{adjcalc}{none}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\adjcalcset}
+% User level settings macro.
+% \begin{macrocode}
+\def\adjcalcset{%
+ \setkeys{adjcalc}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\adjcalc@etex}
+% \begin{macrocode}
+\def\adjcalc@etex{%
+ \protected\def\adjsetlength##1##2{%
+ ##1=\glueexpr(##2)\relax
+ }%
+ \protected\def\adjaddtolength##1##2{%
+ \advance##1 by \glueexpr(##2)\relax
+ }%
+ \protected\def\adjsetcounter##1##2{%
+ \@ifundefined{c@##1}%
+ {\@nocounterr{##1}}%
+ {\global\csname c@##1\endcsname\numexpr(##2)\relax}%
+ }%
+ \protected\def\adjaddtocounter##1##2{%
+ \@ifundefined{c@##1}%
+ {\@nocounterr{##1}}%
+ {\global\advance\csname c@##1\endcsname\numexpr(##2)\relax}%
+ }%
+ \def\adjsetlengthdefault@##1##2{%
+ \@defaultunits##1=\glueexpr##2 \adjcalc@defaultunit\relax\@nnil
+ }%
+ \let\adjsetlengthdefault\adjsetlengthdefault@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\newif\if@adjcalc@needsdefault
+% \end{macrocode}
+%
+%
+% \begin{macro}{\adjcalc@calc}
+% This uses the underlying (re-)definitions of the normal macros (\Macro\setlength, ...) done by the \pkg{calc} package.
+% This allows to locally redefine \Macro\setlength to call \Macro\adjsetlength, etc., without causing an infinite loop.
+% \begin{macrocode}
+\def\adjcalc@calc{%
+ \DeclareRobustCommand\adjsetlength{\calc@assign@skip}%
+ \DeclareRobustCommand\adjaddtolength[1]{\calc@assign@skip{\advance ##1}}%
+ \DeclareRobustCommand\adjsetcounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\csname c@##1\endcsname}{##2}}}%
+ \DeclareRobustCommand\adjaddtocounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\advance\csname c@##1\endcsname}{##2}}}%
+ \def\adjsetlengthdefault@##1##2{%
+ \begingroup
+ \def\calc@post@scan####1!{%
+ \def\@tempa{####1}%
+ \ifx\@tempa\@empty
+ \endgroup% to end calc processing
+ % is number only
+ \global\@adjcalc@needsdefaulttrue
+ \else
+ \endgroup% to end calc processing
+ % full expression
+ \global\@adjcalc@needsdefaultfalse
+ \fi
+ }%
+ \calc@assign@skip{##1}{##2 \adjcalc@defaultunit}%
+ \endgroup
+ \if@adjcalc@needsdefault
+ ##1=##2 \adjcalc@defaultunit\relax
+ \else
+ \calc@assign@skip{##1}{##2}%
+ \fi
+ }%
+ \def\adjcalc@checkdefault##1\@nnil##2##3{%
+ \ifx\relax##1\relax\else
+ \calc@assign@skip{##2}{##3}%
+ \fi
+ }%
+ \let\adjsetlengthdefault\adjsetlengthdefault@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\adjcalc@pgfmath}
+% \begin{macrocode}
+\def\adjcalc@pgfmath{%
+ \DeclareRobustCommand\adjsetlength{\pgfmathsetlength}%
+ \DeclareRobustCommand\adjaddtolength{\pgfmathaddtolength}%
+ \DeclareRobustCommand\adjsetcounter{\pgfmathsetcounter}%
+ \DeclareRobustCommand\adjaddtocounter{\pgfmathaddtocounter}%
+ \def\adjsetlengthdefault@##1##2{%
+ \edef\pgfmathresultunitscale{1\adjcalc@defaultunit}%
+ \let\pgfmathpostparse\pgfmathscaleresult
+ \pgfmathparse{##2}%
+ ##1=\pgfmathresult pt\relax
+ }%
+ \let\adjsetlengthdefault\adjsetlengthdefault@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\adjbox@settobp}
+% \begin{macrocode}
+\def\adjcalc@settobp#1#2{%
+ \begingroup
+ \adjsetlength\@tempdima{#2}%
+ \@tempdima=0.99626\@tempdima
+ \edef\@tempa{\endgroup\def\noexpand#1{\strip@pt\@tempdima\space}}%
+ \@tempa
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\adjcalc@overwrite}
+% \begin{macrocode}
+\def\adjcalc@overwrite{%
+ \let\setlength\adjsetlength
+ \let\addtolength\adjaddtolength
+ \let\setcounter\adjsetcounter
+ \let\addtocounter\adjaddtocounter
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Execute at-end code.
+% \begin{macrocode}
+\adjcalc@atend
+% \end{macrocode}
+% \iffalse
+%</adjcalc.sty>
+% \fi
+%
+% \Finale
+% \endinput
diff --git a/macros/latex/contrib/adjustbox/adjcalc.pdf b/macros/latex/contrib/adjustbox/adjcalc.pdf
new file mode 100644
index 0000000000..f8bb78c491
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/adjcalc.pdf
Binary files differ
diff --git a/macros/latex/contrib/adjustbox/adjustbox.dtx b/macros/latex/contrib/adjustbox/adjustbox.dtx
new file mode 100644
index 0000000000..ebcfeb7176
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/adjustbox.dtx
@@ -0,0 +1,6203 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011-2019 by Martin Scharrer <martin@scharrer-online.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>
+ 2019/01/04
+%<=/DATE>
+%<=*VERSION>
+ v1.2
+%<=/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{3447}
+%
+% \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.
+% }
+%
+% \GetFileInfo{adjustbox.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let}
+%
+% \author{Martin Scharrer}
+% \email{martin@scharrer-online.de}
+% \repository{https://bitbucket.org/martin_scharrer/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.
+%
+%
+% \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}
+% This makes the content to be officially 0pt wide and lap over to the right or left, respectively, like the \LaTeX\ macros \Macro\rlap and \Macro\llap do.
+% These are shortcuts for \Key{lap}'='\AlsoMacro\width and \Key{lap}'=-'\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}
+% \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{print}
+% \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{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 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{decodearray}
+\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{page}
+\adjbox@copy@key{pagebox}
+\adjbox@copy@key{print}
+\adjbox@copy@key{quiet}
+\adjbox@copy@key{resetcolor}
+\adjbox@copy@key{resolution}
+\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}%
+%
+% ^^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{%
+ \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{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=(((,)))
diff --git a/macros/latex/contrib/adjustbox/adjustbox.ins b/macros/latex/contrib/adjustbox/adjustbox.ins
new file mode 100644
index 0000000000..196015c47c
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/adjustbox.ins
@@ -0,0 +1,23 @@
+\input ydocstrip.tex
+\keepsilent
+\askforoverwritefalse
+\generate{%
+ \file{adjustbox.sty}{\nopreamble\from{adjustbox.dtx}{adjustbox.sty}}%
+ \file{adjcalc.sty}{\nopreamble\from{adjcalc.dtx}{adjcalc.sty}}%
+ \file{trimclip.sty}{\nopreamble\from{trimclip.dtx}{trimclip.sty}}%
+ \file{tc-pgf.def}{\nopreamble\from{trimclip.dtx}{tc-pgf.def}}%
+ \file{tc-pdftex.def}{\nopreamble\from{trimclip.dtx}{tc-pdftex.def}}%
+ \file{tc-dvips.def}{\nopreamble\from{trimclip.dtx}{tc-dvips.def}}%
+ \file{tc-xetex.def}{\nopreamble\from{trimclip.dtx}{tc-xetex.def}}%
+ \file{box.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{box.tex}}%
+ \file{compare.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{compare.tex}}%
+ \file{margin2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{margin2.tex}}%
+ \file{margin.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{margin.tex}}%
+ \file{trim2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim2.tex}}%
+ \file{trim3.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim3.tex}}%
+ \file{trim.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim.tex}}%
+ \file{viewport2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{viewport2.tex}}%
+ \file{viewport.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{viewport.tex}}%
+}
+\endbatchfile
+%% vim: ft=tex
diff --git a/macros/latex/contrib/adjustbox/adjustbox.pdf b/macros/latex/contrib/adjustbox/adjustbox.pdf
new file mode 100644
index 0000000000..f9ccff3764
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/adjustbox.pdf
Binary files differ
diff --git a/macros/latex/contrib/adjustbox/trimclip.dtx b/macros/latex/contrib/adjustbox/trimclip.dtx
new file mode 100644
index 0000000000..0240ff55e2
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/trimclip.dtx
@@ -0,0 +1,2351 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011-2018 by Martin Scharrer <martin@scharrer-online.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 trimclip.dtx, adjustbox.ins
+%% and the derived files trimclip.sty,
+%% tc-dvips.def, tc-pdftex.def, tc-pgf.def and tc-xetex.def.
+%% Further author information are located in the .def files.
+%%
+%<=/COPYRIGHT>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{trimclip.dtx}[%
+%<=*DATE>
+ 2018/04/08
+%<=/DATE>
+%<=*VERSION>
+ v1.1
+%<=/VERSION>
+ DTX file for the trimclip package]
+\documentclass[a4paper]{ydoc}[2011/11/16]
+\GetFileInfo{trimclip.dtx}
+\usepackage{trimclip}[\filedate]
+
+\usepackage[utf8]{inputenc}
+\usepackage{standalone}
+
+%\AtBeginDocument{\MakeShortMacroArgs\`\relax}
+%\AtEndDocument{\DeleteShortVerb\`}
+%
+\normalmarginpar
+
+\usepackage{flafter}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\newsavebox\mybox
+
+\renewenvironment{example}[1][Example:]{%
+ \subsubsection*{#1}%
+}{%
+ \par
+}
+\newenvironment{examples}[1][Examples:]{%
+ \subsubsection*{#1}%
+}{%
+ \par
+}
+\optionaloff
+
+\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,
+}
+
+\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
+ \rule[-.25\fboxrule]{\wd\exampleresultbox}{.5\fboxrule}%
+ \hskip-\wd\exampleresultbox
+ }%
+ \usebox\exampleresultbox
+ }%
+}%
+\makeatother
+\colorlet{exampleborder}{black!33}
+\def\Descsep{\par\vskip-2.5ex\relax}
+
+\def\examplecontent{\raisebox{-4pt}{\begin{tabular}[b]{@{}|c|c|@{}}
+ \hline
+ A & B \\
+ \hline
+ C & D \\
+ \hline
+ \end{tabular}%
+}}
+
+%\EnableCrossrefs
+%\CodelineIndex
+%\RecordChanges
+\OnlyDescription
+\renewcommand\topfraction{.9}
+\renewcommand\bottomfraction{.9}
+\renewcommand\textfraction{.1}
+\renewcommand\floatpagefraction{.5}
+\renewcommand\dbltopfraction{.7}
+\renewcommand\dblfloatpagefraction{.5}
+\begin{document}
+ \DocInput{trimclip.dtx}
+ \PrintChanges
+ %\newpage\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1118}
+%
+% \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{v1.0}{2012/05/16}{First version after extraction from \pkg{adjustbox} package.}
+% \changes{v1.1}{2018/04/08}{Driver support for round corner clipping.}
+%
+% \GetFileInfo{trimclip.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let}
+% \bundle{adjustbox}
+% \author{Martin Scharrer}
+% \email{martin@scharrer-online.de}
+% ^^A\repository{https://bitbucket.org/martin_scharrer/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
+%
+% \vspace{-\baselineskip}
+% \begin{abstract}
+% This package extends the standard \pkg{graphicx} package by providing the missing \Macro\trimbox and \Macro\clipbox
+% macros to trim and clip arbitrary \TeX\ material.
+% The macros allow for verbatim content. Equivalent environments are also provided.
+% The package comes with own clipping drivers for all common output formats as well as a \pkg{pgf} fall-back driver.
+% \end{abstract}
+%
+% \section{Introduction}
+% The standard \LaTeX{} package \pkg{graphicx}.^^A\footnote{Actually it is the \pkg{graphics} package, but
+% ^^Athis is assumed to be completely superseded by its extension \pkg{graphicx}.}
+% allows to scale, resize and rotate either images or text (i.e.\ any \TeX\ content). For text the macros
+% \Macro\scalebox, \Macro\resizebox and \Macro\rotatebox can be used, while equivalent keys exist for the
+% \Macro\includegraphics macro. However, while it is possible to trim and clip images using the \Key{trim}, \Key{viewport}
+% and \Key{clip} keys, no equivalent macros are provided. This package closes this gap by defining the macros
+% \Macro\trimbox and \Macro\clipbox. As an extra the macro \Macro\marginbox is also provided. It can be seen as an
+% inverted \Macro\trimbox, expanding the official size of the content instead of reducing it.
+% Originally these macros were included in the \pkg{adjustbox} package together with the general \Macro\adjustbox macro.
+% However, the fundamental clip and trim macros and their driver files are now packed into this minimalistic package,
+% so that other packages can reuse its functionality without the need to load the ever-growing \pkg{adjustbox} package.
+%
+% \enlargethispage{\baselineskip}
+% The macros provided by this package differ in three aspects from the macros defined by \pkg{graphicx}. The content
+% argument is actually read directly as a horizontal box and not as a macro argument, even when the syntax looks the
+% same. This allows for arbitrary content including special things like verbatim material. It is allowed to replace the
+% "{ }" around the content with \Macro\bgroup and \Macro\egroup. Furthermore, for every macro there is an equivalent
+% environment with the same name. Special care is taken to allow the same name for both, which is normally not allowed.
+% Finally, the lengths arguments of the macros can contain algebraic expressions to calculate the used length. This is
+% only possible with the \pkg{graphicx} macros if the \pkg{calc} package is loaded. However, the \pkg{trimclip} macros
+% use the \pkg{adjcalc} wrapper package which either uses $\epsilon$-\TeX\ primitives, \pkg{calc} or \pkg{pgfmath} to
+% provide this feature.
+%
+%
+% \section{Dependencies}
+% This package uses the author's other packages \pkg{collectbox} (to collect the content as a real box) and
+% \pkg{adjcalc} (to allow for math expressions for lengths). The latter is part of the same \pkg{adjustbox} bundle and
+% should have be installed together with \pkg{trimclip}.
+%
+% \section{Drivers}
+% The clip operation can not be implemented using general \TeX\ commands, but is rather output format specific. The
+% clipped material is actually included unclipped and the output file (i.e.\ PDF or PS file) contains format specific
+% instructions, so that the document viewer will clip the content when the document is displayed. Depending on the used
+% compilation work-flow (like |pdflatex|, |latex|+|dvips| or |latex|+|dvipdfm|, etc.) this clipping instructions must be
+% passed in a different way. In order to support all of these, dedicated driver files are provided which hold the
+% specific low-level instructions. This requirement should also be known to most users from the \pkg{graphics/x},
+% \pkg{(x)color} or \pkg{hyperref} packages which also require output format specific low-level instructions to
+% implement their features.
+%
+% A set of driver files for the most common used \LaTeX\ compilers is provided with this package (see
+% \autoref{sec:options} for a list). If no suitable driver file is found, the \pkg{pgf} package is used instead to
+% implement the clip operation. This (large) package comes with its own set of driver files and should cover any other
+% \LaTeX\ compilers. The \pkg{trimclip} drivers were inspired by the \pkg{graphic/x} and \pkg{pgf} driver code and
+% were written by Joseph Wright of the \LaTeX3 project and Martin Scharrer (the author of this package).
+%
+% \section{Package Options}\label{sec:options}
+% Normally the package should be loaded without any options. A suitable driver will then automatically be selected.
+% However, the package accepts the following options to select the used driver manually. Any other option is passed to the
+% \pkg{graphicx} package and the driver selected by it is used. However, this does not work if \pkg{graphicx} or
+% \pkg{graphics} was already loaded before. In this case any unknown option is taken as driver and a file
+% `\MacroArgs'tc-'<option>'.def'\relax' is loaded if it exits. If not, the default PGF fall-back driver is used. PGF
+% comes with a own set of drivers but is large and can be considered a significant overhead if used only for rectangular
+% clipping.
+%
+% \begin{description}
+% \def\Option#1{\item[{{\normalfont\opt{#1}}}]}%
+% \Option{pdftex} Use the |pdftex| driver. This driver is automatically selected for |pdflatex| and |lualatex|
+% and should not be used for any other \LaTeX\ compilers.
+% \Option{dvips} Use the |dvips| driver. This driver is automatically selected for |latex|.
+% \Option{xetex} Use the |xetex| driver. This driver is automatically selected for |xelatex|.
+% \Option{dvipdfm} Use the |xetex| driver which is also compatible with |dvipdfm|.
+% \Option{dvipdfmx} Use the |xetex| driver which is also compatible with |dvipdfmx|.
+% \Option{pgf} Use the fall-back PGF driver explicitly. This makes sense if issue with another driver are encountered.
+% \end{description}
+%
+% It should be noted that choosing an incorrect driver will lead to clip operation not being applied (they act like trim
+% operations) and may lead to a broken output file.
+%
+%
+% \section{Argument Values}\label{sec:argval}
+% All macros of this package and their matching environments require four length values which are used to change the
+% left, bottom, right and top side of the content. Because of the used \pkg{adjcalc} package complicated algebraic
+% expressions can be used to calculate these amounts. The used math engine can be changed by loading \pkg{adjcalc}
+% with the appropriate option before loading \pkg{trimclip}. Please see the \pkg{adjcalc} manual for more details
+% on this.
+% Like with the |trim| or |viewport| keys of \Macro\includegraphics the length values must be separated by spaces.
+% Note that if a previous length expression ends in a macro any trailing spaces will be removed by \TeX. Therefore it
+% is required to wrap this \emph{complete} length expression in braces.
+% Several examples of this are shown in the \emph{Usage} section.
+% It is also possible to only provide a single length which is used for all four
+% sides or only two lengths which are taken for the left/right as well as bottom/top side. This simplifies symmetric
+% operations and got inspired by Cascading Style Sheets (CSS) used to style websites.
+%
+% If a length value is a simple number without a unit, a default unit is substituted (usually `|bp|', \emph{big points},
+% the standard PostScript and PDF unit). This default unit can be changed using \Macro\adjcalc{'defaultunit='<unit>} or
+% completely disabled (\MacroArgs'defaultunit=none'). See the \pkg{adjcalc} manual for more details.
+%
+% The length values can contain the following macros to refer to the original size of the content:
+%
+% \DescribeMacros
+% \hbox{\Macro\width~~~\Macro\height~~~\Macro\depth~~~\Macro\totalheight}%
+% \endDescribeMacros
+% These \LaTeX{} lengths hold the original dimensions of the content and can be used to make relative changes. Like any
+% other length registers they can be used with a factor, e.g.\ \MacroArgs'.5'\AlsoMacro\width to refer to half the
+% natural width of the content.
+%
+%
+% \section{Usage}
+%
+% \subsection{Trimming}
+% \vspace{-\medskipamount}
+% \DescribeMacro\trimbox{<llx>~<lly>~<urx>~<ury>}{<content>}
+% \DescribeMacro\trimbox{<all sites>}{<content>}
+% \DescribeMacro\trimbox{<left/right>~<top/bottom>}{<content>}
+% \DescribeMacro\trimbox*{<llx>~<lly>~<urx>~<ury>}{<content>}
+% The macro \Macro\trimbox trims the given amount from the lower left (ll) and the upper right (ur) corner of
+% the box. This means that the amount \meta{llx} is trimmed from the left side, \meta{lly} from the bottom and
+% \meta{urx} and \meta{ury} from the right and top of the box, respectively.
+% If only one value is given it will be used for all four sites.
+% If only two values are given the first one will be used for the left and right side (llx, urx) and the second for the bottom and top side (lly, ury).
+%
+% If the starred version is used the four coordinates are taken as the \Key{viewport} instead, i.e. the box
+% is trimmed to the rectangle described by the coordinates. In this case all four values must be specified explicitly.
+%
+% \begin{examples}
+% \begin{examplecode}
+% \examplecontent
+% \end{examplecode}
+% \begin{examplecode}
+% \trimbox{2pt 3pt 2pt 3pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \trimbox{2pt 3pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \trimbox{2pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \trimbox{{.5\width} {.5\totalheight} 2pt 2pt}
+% {\examplecontent}
+% \end{examplecode}
+% \medskip
+% \begin{examplecode}
+% \trimbox*{5pt 0pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \medskip
+% \begin{examplecode}
+% \trimbox*{5pt -2pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \medskip
+% \begin{examplecode}
+% \trimbox*{5pt 10pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \bigskip
+% \bigskip
+% \begin{examplecode}
+% \trimbox*{5pt -3pt 3em -1pt}{\examplecontent}
+% \end{examplecode}
+% \end{examples}
+%
+%
+% \DescribeEnv[<content>]{trimbox}{<1, 2 or 4 trim values>}
+% \vspace{-\baselineskip}
+% \DescribeEnv[<content>]{trimbox*}{<llx>~<lly>~<urx>~<ury>}
+% The \env{trimbox} and \env{trimbox*} environments do the same as the corresponding macros.
+%
+%
+% \Needspace*{10\baselineskip}
+% \subsection{Clipping}
+% \vspace{-\medskipamount}
+% \DescribeMacro\clipbox{<llx>~<lly>~<urx>~<ury>}{<content>}
+% \DescribeMacro\clipbox{<all sites>}{<content>}
+% \DescribeMacro\clipbox{<left/right>~<top/bottom>}{<content>}
+% \DescribeMacro\clipbox*{<llx>~<lly>~<urx>~<ury>}{<content>}
+% The \Macro\clipbox macro works like the \Macro\trimbox and trims the given amounts from the \meta{text}.
+% However, in addition the trimmed material is also clipped, i.e. it is not shown in the final document.
+% Note that the material will still be part of the output file but is simply not shown.
+% The full content can still be exported using special tools, so using \Macro\clipbox\relax (or \Macro\includegraphics[clip,trim=...])
+% to censor classified information would be a bad idea.
+% The starred version will again use the given coordinates as viewport.
+%
+% \DescribeEnv[<content>]{clipbox}{<1, 2 or 4 trim values>}
+% \vspace{-\baselineskip}
+% \DescribeEnv[<content>]{clipbox*}{<llx>~<lly>~<urx>~<ury>}
+% The environment versions of \Macro\clipbox and \Macro\clipbox*. The same rules as for the trimming environments apply.
+%
+% \begin{examples}
+% \begin{examplecode}
+% \examplecontent
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox{2pt 3pt 2pt 3pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox{2pt 3pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox{2pt}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox{{.5\width} {.5\totalheight} 2pt 2pt}
+% {\examplecontent}
+% \end{examplecode}
+% \medskip
+% \begin{examplecode}
+% \clipbox*{5pt 0pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \medskip
+% \begin{examplecode}
+% \clipbox*{5pt -2pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox*{5pt 10pt 3em 2em}{\examplecontent}
+% \end{examplecode}
+% \begin{examplecode}
+% \clipbox*{5pt -3pt 3em -1pt}{\examplecontent}
+% \end{examplecode}
+% \end{examples}
+%
+% \subsection{Margin}
+% \vspace{-\medskipamount}
+% \DescribeMacro\marginbox{<all sites>}{<content>}
+% \DescribeMacro\marginbox{<left/right>~<top/bottom>}{<content>}
+% \DescribeMacro\marginbox{<llx>~<lly>~<urx>~<ury>}{<content>}
+% \Descsep
+% \DescribeEnv[<content>]{marginbox*}{<1, 2 or 4 margin values>}
+% This macro and environment can be used to add a margin (white space) around the content. It can be seen as the opposite of \Macro\trimbox.
+% The original baseline of the content is preserved because \meta{lly} is added to the depth.
+%
+% \begin{example}
+% \begin{examplecode}
+% Before \fbox{\marginbox{1ex 2ex 3ex 4ex}{Text}} After
+% \end{examplecode}
+% \end{example}
+%
+%
+% \DescribeMacro\marginbox'*'{<all sites>}{<content>}
+% \DescribeMacro\marginbox'*'{<left/right>~<top/bottom>}{<content>}
+% \DescribeMacro\marginbox'*'{<llx>~<lly>~<urx>~<ury>}{<content>}
+% \Descsep
+% \DescribeEnv[<content>]{marginbox}{<1, 2 or 4 margin values>}
+% This starred version is almost identical to the normal \Macro\marginbox, but also raises the content by the \MacroArgs<lly>
+% amount, so that the original depth is preserved instead of the original baseline.
+% Note that while \Macro\marginbox is basically the opposite of \Macro\trimbox, \Macro\marginbox* is not the opposite of \Macro\trimbox*.
+%
+% \begin{example}
+% \begin{examplecode}
+% Before \fbox{\marginbox*{1ex 2ex 3ex 4ex}{Text}} After
+% \end{examplecode}
+% \end{example}
+%
+%
+% \clearpage
+% \section{Diagrams}
+% ^^A This section explains the details about the trim and clip implementations.
+% ^^A It should give the interested reader a deeper understanding of the operations and the behaviour in normal and edge cases.
+% The box dimensions, trim values and change of the baseline for different scenarios are visualized by the following diagrams.
+%
+% \begin{figure}[!bt]
+% \centering
+% {\catcode`\%=14\relax\input{box}}
+% \caption{Box dimensions. Shown are also the \LaTeX\ macros and the \TeX\ primitives. Here \cs{br} stands for a box register.
+% Note that the depth is a positive values on its own downwards pointed axes.
+% }\label{fig:boxdim}
+% \end{figure}
+%
+% \begin{figure}[!bt]
+% \centering
+% {\catcode`\%=14\relax\input{trim}}
+% \caption{Trimming. The four values are removed from each side.}\label{fig:trim}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{trim2}}
+% \caption{Trimming with \texttt{lly}$>$depth. In this case the resulting box moves up to the original baseline.}\label{fig:trim2}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{trim3}}
+% \caption{Trimming with \texttt{ury}$>$height. In this case the resulting box falls down to the original baseline}\label{fig:trim2}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{viewport}}
+% \caption{Viewport with \texttt{lly}$>$0pt. The \texttt{ll} and \texttt{ur} values are taken from the origin. The baseline is the vertical zero reference.}\label{fig:viewport}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{viewport2}}
+% \caption{Viewport with \texttt{lly}$<$0pt. In this case the viewport ranges into the depth of the original box.}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{margin}}
+% \caption{Marginbox. The \texttt{llx} and \texttt{urx} are added to the left and right and increase the width. The \texttt{ury} is added to the height
+% and \texttt{lly} to the depth of the box. This keeps the baseline at the original position.}
+% \label{fig:margin}
+% \end{figure}
+%
+% \begin{figure}
+% \centering
+% {\catcode`\%=14\relax\input{margin2}}
+% \caption{Marginbox*. In addition to the normal margin the content
+% is also raised by \texttt{lly}, so that the original depth is preserved.
+% This effectively moves the baseline down.}
+% \label{fig:margin}
+% \end{figure}
+%
+% \StopEventually{}
+% \clearpage
+% \section{Implementation}
+% \setcounter{lstnumber}{1}
+%
+%
+% \iffalse
+%<*trimclip.sty>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesPackage{trimclip}[%
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Trim and clip general TeX material]
+% \end{macrocode}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Options}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \begin{macrocode}
+\def\tc@driver{tc-\Gin@driver}
+\DeclareOption{pgf}{\def\tc@driver{tc-pgf.def}\AtEndOfPackage{\RequirePackage{pgf}}}
+\DeclareOption{pdftex}{\def\tc@driver{tc-pdftex.def}\PassOptionsToPackage{pdftex}{graphicx}}
+\DeclareOption{xetex}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
+\DeclareOption{dvips}{\def\tc@driver{tc-dvips.def}\PassOptionsToPackage{dvips}{graphicx}}
+\DeclareOption{dvipdfm}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
+\DeclareOption{dvipdf}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
+\DeclareOption*{%
+ \@ifpackageloaded{graphics}{%
+ \edef\tc@driver{tc-\CurrentOption.def}%
+ \begingroup
+ \edef\@tempa{\CurrentOption.def}%
+ \ifx\@tempa\Gin@driver\else
+ \let\on@line\@gobble
+ \PackageWarning{trimclip}{%
+ A different clipping driver was requested than the\MessageBreak
+ one used for 'graphics/x'! This is not recommended\MessageBreak
+ and can lead to defect output files.%
+ }%
+ \fi
+ \endgroup
+ }{%
+ \def\tc@driver{tc-\Gin@driver}%
+ \PassOptionsToPackage\CurrentOption{graphicx}%
+ }%
+}
+\ProcessOptions*\relax
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{graphicx}[1999/02/16]
+\RequirePackage{collectbox}[2011/08/22]
+\RequirePackage{adjcalc}
+% \end{macrocode}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{User level and auxiliary macros}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{macro}{\tc@readvalues}
+% Reads the four values for trim, viewport and clip.
+% Valid inputs are:
+% 4 values directly,
+% 1 value which is taken four times,
+% 2 values which is taken for left/right and top/bottom.
+% \begin{macrocode}
+\def\tc@readvalues#1{%
+ \tc@@readvalues#1 {} {} {} \\%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tc@@readvalues}
+% \begin{macrocode}
+\def\tc@@readvalues#1 #2 #3 #4 #5\\{%
+ \adjsetlengthdefault\tc@llx{#1}%
+ \ifx\@nnil#2\@nnil
+ \tc@lly\tc@llx
+ \tc@urx\tc@llx
+ \tc@ury\tc@llx
+ \else
+ \adjsetlengthdefault\tc@lly{#2}%
+ \ifx\@nnil#3\@nnil
+ \tc@urx\tc@llx
+ \tc@ury\tc@lly
+ \else
+ \adjsetlengthdefault\tc@urx{#3}%
+ \adjsetlengthdefault\tc@ury{#4}%
+ \fi
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tc@llx}
+% \begin{macro}{\tc@lly}
+% \begin{macro}{\tc@urx}
+% \begin{macro}{\tc@ury}
+% Dimension registers for the four trim/viewport values.
+% Legend: ll = lower left, ur = upper right.
+% \begin{macrocode}
+\newdimen\tc@llx
+\newdimen\tc@lly
+\newdimen\tc@urx
+\newdimen\tc@ury
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\trimbox}
+% \begin{macrocode}
+\newcommand\trimbox{%
+ \collectboxcheckenv{trimbox}%
+ \@ifstar
+ \trimbox@s
+ \trimbox@
+}
+\def\trimbox@#1{%
+ \collectbox{\@trimclip\@trimbox{#1}}%
+}
+\def\trimbox@s#1{%
+ \collectbox{\@trimclip\@viewportbox{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{trimbox*}
+% \begin{macrocode}
+\expandafter\newcommand\expandafter*\csname trimbox*\endcsname{%
+ \@collectboxisenv{trimbox*}%
+ \trimbox@s
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{macro}{\clipbox}
+% \begin{macrocode}
+\newcommand\clipbox{%
+ \collectboxcheckenv{clipbox}%
+ \@ifstar
+ \clipbox@s
+ \clipbox@
+}
+\def\clipbox@#1{%
+ \collectbox{\@trimclip\@clipbox{#1}}%
+}
+\def\clipbox@s#1{%
+ \collectbox{\@trimclip\@clipvpbox{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{clipbox*}
+% \begin{macrocode}
+\expandafter\newcommand\expandafter*\csname clipbox*\endcsname{%
+ \@collectboxisenv{clipbox*}%
+ \clipbox@s
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{macro}{\marginbox}[1]{Margins as space separated values (like for 'trim')}
+% Collect box first.
+% \begin{macrocode}
+\newcommand\marginbox{%
+ \collectboxcheckenv{marginbox}%
+ \@ifstar
+ \marginbox@s
+ \marginbox@
+}
+\def\marginbox@#1{%
+ \@collectbox{\@trimclip\@marginbox{#1}}%
+}
+\def\marginbox@s#1{%
+ \@collectbox{\@trimclip\@marginraisebox{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{marginbox*}[1]{Margins as space separated values (like for 'trim')}
+% \begin{macrocode}
+\expandafter\newcommand\expandafter*\csname marginbox*\endcsname{%
+ \@collectboxisenv{marginbox*}%
+ \marginbox@s
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{macro}{\@trimclip}[2]{<trim/viewport/clip macro>}{<values>}
+% General macro which parses the values and feeds it to the given lower-level macro.
+% Finally the box is typeset. This macro will always be used inside a group
+% created by \Macro\@collectbox.
+% \begin{macrocode}
+\def\@trimclip#1#2{%
+ \tc@readvalues{#2}%
+ #1%
+ \collectedbox
+ \tc@llx
+ \tc@lly
+ \tc@urx
+ \tc@ury
+ \usebox\collectedbox
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Low-level commands}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \begin{macro}{\tc@correctbaseline}
+% Adjust baseline if required by negative depth or height.
+% \begin{macrocode}
+\def\tc@correctbaseline#1{%
+% \end{macrocode}
+% If depth is negative lower the box to get zero depth
+% \begin{macrocode}
+ \ifdim\dp#1<\z@
+ \raise\dp#1%
+ \else
+% \end{macrocode}
+% Else if height is negative lower the box to get zero height
+% \begin{macrocode}
+ \ifdim\ht#1<\z@
+ \lower\ht#1%
+ \fi\fi
+ \box#1%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tc@correctdims}
+% Ensure that all dimensions are non-negative.
+% \begin{macrocode}
+\def\tc@correctdims#1{%
+ \ifdim\dp#1<\z@ \dp#1=\z@ \fi
+ \ifdim\wd#1<\z@ \wd#1=\z@ \fi
+ \ifdim\ht#1<\z@ \ht#1=\z@ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@trimbox}[5]{<box register>}{<tllx>}{<tlly>}{<turx>}{<tury>}
+% Removes the four length for the left, bottom, right and top from the official size of the box register.
+% \begin{macrocode}
+\def\@trimbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ %
+ \tc@llx=#2\relax
+ \tc@lly=#3\relax
+ \advance\tc@lly-\dp#1%
+ \tc@urx=#4\relax
+ \advance\tc@urx-\wd#1%
+ \tc@ury=#5\relax
+ \advance\tc@ury-\ht#1%
+ %
+ % Set dimensions now.
+ % This allows that the arguments can refer
+ % to the original dimensions without issues.
+ \hskip-\tc@llx
+ \dp#1-\tc@lly
+ \wd#1-\tc@urx
+ \ht#1-\tc@ury
+ %
+ \tc@correctbaseline{#1}%
+ }%
+ \tc@correctdims{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@marginbox}
+% Adds the given margins to the depth, width and height.
+% The left margin is created by an horizontal skip.
+% This implementation assumes that the margins are positive and no special checks are added.
+% While negative margins will trim some margin off, this will not lead to correct results if this amounts
+% are larger than the existing dimensions. For this the \Macro\@trimbox macro should be used.
+% \begin{macrocode}
+\def\@marginbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ %
+ \tc@llx=#2\relax
+ \tc@lly=#3\relax
+ \advance\tc@lly\dp#1%
+ \tc@urx=#4\relax
+ \advance\tc@urx\wd#1%
+ \tc@ury=#5\relax
+ \advance\tc@ury\ht#1%
+ %
+ % Set dimensions now.
+ % This allows that the arguments can refer
+ % to the original dimensions without issues.
+ \hskip\tc@llx
+ \dp#1\tc@lly
+ \wd#1\tc@urx
+ \ht#1\tc@ury
+ %
+ \box#1%
+ }%
+ \tc@correctdims{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@marginraisebox}
+% Like \Macro\@marginbox but raises the box accordant to the bottom margin,
+% so that the original depth is kept.
+% \begin{macrocode}
+\def\@marginraisebox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ %
+ \tc@llx=#2\relax
+ \tc@lly=#3\relax
+ \tc@urx=#4\relax
+ \advance\tc@urx\wd#1%
+ \tc@ury=#5\relax
+ \advance\tc@ury\ht#1%
+ %
+ % Set dimensions now.
+ % This allows that the arguments can refer
+ % to the original dimensions without issues.
+ \hskip\tc@llx
+ \wd#1\tc@urx
+ \ht#1\tc@ury
+ % Copy original tty values (ury is taken as temp dimension)
+ \tc@ury=\tc@lly
+ \advance\tc@lly\dp#1%
+ \dp#1\tc@lly
+ % Raise bu original tty value (now in ury)
+ \raise\tc@ury\box#1%
+ }%
+ \tc@correctdims{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@trimbox}[5]{<box register>}{<tllx>}{<tlly>}{<turx>}{<tury>}
+% Removes the four length for the left, bottom, right and top from the official size of the box register.
+% \begin{macrocode}
+\def\@viewportbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ %
+ % Assign values
+ \tc@llx=#2\relax
+ \tc@lly=#3\relax
+ \tc@urx=#4\relax
+ \tc@ury=#5\relax
+ %
+ % Set dimensions now.
+ % This allows that the arguments can refer
+ % to the original dimensions without issues.
+ \hskip-\tc@llx
+ \dp#1-\tc@lly
+ \wd#1\tc@urx
+ \ht#1\tc@ury
+ %
+ \tc@correctbaseline{#1}%
+ }%
+ \tc@correctdims{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clipbox}
+% Clips the box using the given trim amounts.
+% For this the box is first trimmed and then clipped to its official size using a driver dependent macro.
+% \begin{macrocode}
+\def\@clipbox#1#2#3#4#5{%
+ \@trimbox{#1}{#2}{#3}{#4}{#5}%
+ \@cliptoboxdim{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@clipvpbox}
+% Clips the box using the given trim amounts.
+% For this the box is first trimmed and then clipped to its official size using a driver dependent macro.
+% \begin{macrocode}
+\def\@clipvpbox#1#2#3#4#5{%
+ \@viewportbox{#1}{#2}{#3}{#4}{#5}%
+ \@cliptoboxdim{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Driver loading}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The clipping support is output driver dependent. The driver selected by \pkg{graphics} is used and a definition file
+% is used if its exists. Otherwise either the default \texttt{pdftex} implementation or the \pkg{pgf} fall-back driver
+% is used.
+%
+%
+%
+% \begin{macro}{\tc@bezfacn}
+% The Bezier factor required to draw rounded corners in same drivers.
+% \begin{macrocode}
+\def\tc@bezfacn{0.44771525}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\InputIfFileExists{\tc@driver}{%
+ {\let\on@line\@gobble
+ \PackageInfo{trimclip}{Using driver '\tc@driver'.}}%
+}{%
+ \input{tc-pgf.def}%
+ {\let\on@line\@gobble
+ \PackageInfo{trimclip}{No clipping driver '\tc@driver' available.\MessageBreak Using fall-back PGF driver.}}%
+}
+% \end{macrocode}
+%
+%
+% \iffalse
+%</trimclip.sty>
+% \fi
+%
+% \subsection{Driver files}
+%
+% \subsubsection{PGF fall-back driver}
+% \iffalse
+%<*tc-pgf.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-pgf.def}[2019/01/04 v2.2 trimclip fall-back clipping driver using PGF]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{pgf}
+% \end{macrocode}
+%
+% \begin{macro}{\@cliptoboxdim}
+% Clips to official box dimension.
+% \begin{macrocode}
+\def\@cliptoboxdim#1{%
+ \setbox#1\hbox{\begin{pgfpicture}%
+ \pgfpathmoveto{\pgfqpoint\z@{-\dp#1}}%
+ \pgfpathlineto{\pgfqpoint\z@{\ht#1}}%
+ \pgfpathlineto{\pgfqpoint{\wd#1}{\ht#1}}%
+ \pgfpathlineto{\pgfqpoint{\wd#1}{-\dp#1}}%
+ \pgfpathclose
+ \pgfusepathqclip
+ \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}%
+ \pgfnode{rectangle}{base west}{\usebox#1}{}{}%
+ \pgfsetbaselinepointnow{\pgfpoint\z@\z@}%
+ \end{pgfpicture}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% Clips round corners off.
+% \begin{macrocode}
+\def\@clipcornersofbox#1#2#3#4#5{%
+ \setbox#1\hbox{\begin{pgfpicture}%
+ \pgfpathmoveto{\pgfpoint{\z@}{\ht#1-#2}}%
+ \pgfpatharc{180}{90}{#2}%
+ \pgfpathlineto{\pgfpoint{\wd#1-#3}{\ht#1}}%
+ \pgfpatharc{90}{0}{#3}%
+ \pgfpathlineto{\pgfpoint{\wd#1}{#5-\dp#1}}%
+ \pgfpatharc{0}{-90}{#5}%
+ \pgfpathlineto{\pgfpoint{#4}{-\dp#1}}%
+ \pgfpatharc{270}{180}{#4}%
+ \pgfpathlineto{\pgfpoint{\z@}{\ht#1-#2}}%
+ \pgfpathclose
+ \pgfusepathqclip
+ \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}%
+ \pgfnode{rectangle}{base west}{\usebox#1}{}{}%
+ \pgfsetbaselinepointnow{\pgfpoint\z@\z@}%
+ \end{pgfpicture}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>}
+% Round frame around a box.
+% \begin{macrocode}
+\def\@rndframearoundbox#1#2#3#4#5#6{%
+ \setbox#1\hbox{\begin{pgfpicture}%
+ \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+ \edef\@tempa{#6}%
+ \ifx\@empty\@tempa\else
+ \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}%
+ \fi
+ \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}%
+ \pgfnode{rectangle}{base west}{\usebox#1}{}{}%
+ \pgfusepath{}%
+ \adjbox@rndframe@color
+ \pgfpathmoveto{\pgfpoint{\z@}{\ht#1-#2}}%
+ \pgfpatharc{180}{90}{#2}%
+ \pgfpathlineto{\pgfpoint{\wd#1-#3}{\ht#1}}%
+ \pgfpatharc{90}{0}{#3}%
+ \pgfpathlineto{\pgfpoint{\wd#1}{#5-\dp#1}}%
+ \pgfpatharc{0}{-90}{#5}%
+ \pgfpathlineto{\pgfpoint{#4}{-\dp#1}}%
+ \pgfpatharc{270}{180}{#4}%
+ \pgfpathlineto{\pgfpoint{\z@}{\ht#1-#2}}%
+ \pgfpathclose
+ \pgfusepath{stroke}%
+ \pgfsetbaselinepointnow{\pgfpoint\z@\z@}%
+ \end{pgfpicture}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-pgf.def>
+% \fi
+%
+% \subsubsection{pdftex driver}
+% \iffalse
+%<*tc-pdftex.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-pdftex.def}[2019/01/04 v2.2 Clipping driver for pdftex]
+% \end{macrocode}
+%
+% \begin{macro}{\@cliptoboxdim}
+% Clips to official box dimension.
+%
+% Uses now \Macro\pdfliteral because \Macro\pdfxform does not support
+% transparencies and patterns with TikZ.
+% \begin{macrocode}
+\def\@cliptoboxdim#1{%
+ \setbox#1=\hbox{%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\DEPTH{\dp#1}%
+ \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}%
+ \pdfsave
+ \pdfliteral direct {%
+ 0 -\DEPTH\space \WIDTH\space \TOTALHEIGHT\space re W n
+ }%
+ \hbox to 0pt{\copy#1\hss}%
+ \pdfrestore
+ \hskip\wd#1
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clip@bpdimens}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% \begin{macrocode}
+\def\@clip@bpdimens#1#2#3#4#5{%
+ \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}%
+ \adjcalc@settobp\HEIGHT{\ht#1}%
+ \adjcalc@settobp\DEPTH{-\dp#1}%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\RADIUSTL{#2}%
+ \adjcalc@settobp\RADIUSTR{#3}%
+ \adjcalc@settobp\RADIUSBR{#5}%
+ \adjcalc@settobp\RADIUSBL{#4}%
+ \adjcalc@settobp\RADIUSTLb{\tc@bezfacn#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTL{\ht#1-#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTLb{\ht#1-\tc@bezfacn#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTR{\ht#1-#3}%
+ \adjcalc@settobp\HEIGHTmRADIUSTRb{\ht#1-\tc@bezfacn#3}%
+ \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}%
+ \adjcalc@settobp\WIDTHmRADIUSTRb{\wd#1-\tc@bezfacn#3}%
+ \adjcalc@settobp\RADIUSBRmDEPTH{#5-\dp#1}%
+ \adjcalc@settobp\RADIUSBRmDEPTHb{\tc@bezfacn#5-\dp#1}%
+ \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}%
+ \adjcalc@settobp\WIDTHmRADIUSBRb{\wd#1-\tc@bezfacn#5}%
+ \adjcalc@settobp\RADIUSBLmDEPTH{#4-\dp#1}%
+ \adjcalc@settobp\RADIUSBLmDEPTHb{\tc@bezfacn#4-\dp#1}%
+ \adjcalc@settobp\RADIUSBLb{\tc@bezfacn#4}%
+ \adjcalc@settobp\LINEWIDTH{\fboxrule}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clip@roundedbox@pdfcode}
+% \begin{macrocode}
+\def\@clip@roundedboxpath@pdfcode{%
+ 0 \HEIGHTmRADIUSTL m
+ 0 \HEIGHTmRADIUSTLb \RADIUSTLb \HEIGHT \RADIUSTL \HEIGHT c
+ \WIDTHmRADIUSTR \HEIGHT l
+ \WIDTHmRADIUSTRb \HEIGHT \WIDTH \HEIGHTmRADIUSTRb \WIDTH \HEIGHTmRADIUSTR c
+ \WIDTH \RADIUSBRmDEPTH l
+ \WIDTH \RADIUSBRmDEPTHb \WIDTHmRADIUSBRb \DEPTH \WIDTHmRADIUSBR \DEPTH c
+ \RADIUSBL \DEPTH l
+ \RADIUSBLb \DEPTH 0 \RADIUSBLmDEPTHb 0 \RADIUSBLmDEPTH c
+ 0 \RADIUSBLmDEPTH l
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% Clips round corners off.
+% \begin{macrocode}
+\def\@clipcornersofbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}%
+ \pdfsave
+ \pdfliteral direct {%
+ \@clip@roundedboxpath@pdfcode
+ h W n
+ }%
+ \hbox to 0pt{\copy#1\hss}%
+ \pdfrestore
+ \hskip\wd#1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>}
+% Round frame around a box.
+% \begin{macrocode}
+\def\@rndframearoundbox#1#2#3#4#5#6{%
+ \setbox#1=\hbox{%
+ \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+ \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}%
+ \edef\@tempa{#6}%
+ \ifx\@empty\@tempa\else
+ \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}%
+ \fi
+ %
+ \hbox to 0pt{\copy#1\hss}%
+ \pdfsave
+ \hbox to 0pt{%
+ \color@setgroup
+ \adjbox@rndframe@color
+ \pdfliteral direct {%
+ \LINEWIDTH w
+ \@clip@roundedboxpath@pdfcode
+ h s
+ }%
+ \color@endgroup
+ }%
+ \pdfrestore
+ \hskip\wd#1%
+ }%
+ \adjsetlength\@tempdima{.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-pdftex.def>
+% \fi
+%
+% \subsubsection{dvips driver}
+% \iffalse
+%<*tc-dvips.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-dvips.def}[2019/01/04 v2.2 Clipping driver for dvips]
+% \end{macrocode}
+%
+% \begin{macro}{\@cliptoboxdim}[1]{box register to clip}
+% Clips to official box dimension.
+%
+% The following clipping code was suggested by
+% Joseph Wright (LaTeX3 project), but slightly modified
+% for this package.
+% \begin{macrocode}
+\def\@cliptoboxdim#1{%
+ \setbox#1=\hbox{%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\DEPTH{\dp#1}%
+ \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}%
+ \special{%
+ ps:
+ /mtrxc matrix currentmatrix def
+ currentpoint gsave
+ translate
+ Resolution 72 div VResolution 72 div
+ scale
+ newpath
+ 0 \DEPTH \WIDTH \TOTALHEIGHT rectclip
+ newpath
+ mtrxc setmatrix
+ }%
+ \hbox to 0pt{\copy#1\hss}%
+ \special{ps: grestore }%
+ \hskip\wd#1%
+ }%
+}
+%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% Clips round corners off.
+% \begin{macrocode}
+\def\@clipcornersofbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ \adjcalc@settobp\DEPTHmRADIUSBL\@tempdima
+ \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}%
+ \adjcalc@settobp\HEIGHT{-\ht#1}%
+ \adjcalc@settobp\DEPTH{\dp#1}%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\RADIUSTL{#2}%
+ \adjcalc@settobp\RADIUSTR{#3}%
+ \adjcalc@settobp\RADIUSBL{#4}%
+ \adjcalc@settobp\RADIUSBR{#5}%
+ \adjcalc@settobp\RADIUSTLmHEIGHT{#2-\ht#1}%
+ \adjcalc@settobp\RADIUSTRmHEIGHT{#3-\ht#1}%
+ \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}%
+ \adjcalc@settobp\DEPTHmRADIUSBR{\dp#1-#5}%
+ \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}%
+ \adjcalc@settobp\DEPTHmRADIUSBL{\dp#1-#4}%
+ \special{%
+ ps:
+ /mtrxc matrix currentmatrix def
+ currentpoint gsave
+ translate
+ Resolution 72 div VResolution 72 div
+ scale
+ newpath
+ %0 \DEPTH neg translate
+ %0 \DEPTH \WIDTH \TOTALHEIGHT rectclip
+ 0 \RADIUSTLmHEIGHT\space moveto
+ \RADIUSTL\space \RADIUSTLmHEIGHT\space \RADIUSTL\space 180 -90 arc
+ \WIDTHmRADIUSTR\space \HEIGHT\space lineto
+ \WIDTHmRADIUSTR\space \RADIUSTRmHEIGHT\space \RADIUSTR\space -90 0 arc
+ \WIDTH\space \DEPTHmRADIUSBR\space lineto
+ \WIDTHmRADIUSBR\space \DEPTHmRADIUSBR\space \RADIUSBR\space 0 90 arc
+ \RADIUSBL\space \DEPTH\space lineto
+ \RADIUSBL\space \DEPTHmRADIUSBL\space \RADIUSBL\space -270 -180 arc
+ closepath
+ %gsave 0.5 0 0 setrgbcolor stroke grestore
+ clip
+ newpath
+ mtrxc setmatrix
+ }%
+ \hbox to 0pt{\copy#1\hss}%
+ \special{ps: grestore }%
+ \hskip \wd#1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>}
+% Clips round corners off.
+% \begin{macrocode}
+\def\@rndframearoundbox#1#2#3#4#5#6{%
+ \setbox#1=\hbox{%
+ \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+ \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}%
+ \adjcalc@settobp\HEIGHT{-\ht#1}%
+ \adjcalc@settobp\DEPTH{\dp#1}%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\RADIUSTL{#2}%
+ \adjcalc@settobp\RADIUSTR{#3}%
+ \adjcalc@settobp\RADIUSBR{#5}%
+ \adjcalc@settobp\RADIUSBL{#4}%
+ \adjcalc@settobp\RADIUSTLmHEIGHT{#2-\ht#1}%
+ \adjcalc@settobp\RADIUSTRmHEIGHT{#3-\ht#1}%
+ \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}%
+ \adjcalc@settobp\DEPTHmRADIUSBR{\dp#1-#5}%
+ \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}%
+ \adjcalc@settobp\DEPTHmRADIUSBL{\dp#1-#4}%
+ \adjcalc@settobp\LINEWIDTH{\fboxrule}%
+ \edef\@tempa{#6}%
+ \ifx\@empty\@tempa\else
+ \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}%
+ \fi
+ %
+ \hbox to 0pt{\copy#1\hss}%
+ \hbox to 0pt{%
+ \color@setgroup
+ \adjbox@rndframe@color
+ \special{%
+ ps:
+ /mtrxc matrix currentmatrix def
+ currentpoint gsave
+ translate
+ Resolution 72 div VResolution 72 div
+ scale
+ newpath
+ %0 \DEPTH neg translate
+ %0 \DEPTH \WIDTH \TOTALHEIGHT rectclip
+ 0 \RADIUSTLmHEIGHT moveto
+ \RADIUSTL \RADIUSTLmHEIGHT \RADIUSTL 180 -90 arc
+ \WIDTHmRADIUSTR \HEIGHT lineto
+ \WIDTHmRADIUSTR \RADIUSTRmHEIGHT \RADIUSTR -90 0 arc
+ \WIDTH \DEPTHmRADIUSBR lineto
+ \WIDTHmRADIUSBR \DEPTHmRADIUSBR \RADIUSBR 0 90 arc
+ \RADIUSBL \DEPTH lineto
+ \RADIUSBL \DEPTHmRADIUSBL \RADIUSBL -270 -180 arc
+ closepath
+ \LINEWIDTH setlinewidth
+ stroke
+ newpath
+ mtrxc setmatrix
+ grestore
+ }%
+ \color@endgroup
+ }%
+ \hskip \wd#1%
+ }%
+ \adjsetlength\@tempdima{.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-dvips.def>
+% \fi
+%
+% \subsubsection{xetex driver}
+% \iffalse
+%<*tc-xetex.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-xetex.def}[2019/01/04 v2.2 Clipping driver for xetex]
+% \end{macrocode}
+%
+% \begin{macro}{\@cliptoboxdim}
+% Clips to official box dimension.
+%
+% The following clipping code was suggested by
+% Joseph Wright (LaTeX3 project), but slightly modified
+% for this package.
+% \begin{macrocode}
+\def\@cliptoboxdim#1{%
+ \setbox#1=\hbox{%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\DEPTH{\dp#1}%
+ \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}%
+ \special{pdf:content q }%
+ \special{pdf:code 0 -\DEPTH \WIDTH \TOTALHEIGHT re W n }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \special{pdf:content q }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \hbox to 0 pt{\copy#1\hss}%
+ \special{pdf:literal direct Q }%
+ \special{pdf:literal direct Q }%
+ \hskip\wd#1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clip@bpdimens}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% \begin{macrocode}
+\def\@clip@bpdimens#1#2#3#4#5{%
+ \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}%
+ \adjcalc@settobp\HEIGHT{\ht#1}%
+ \adjcalc@settobp\DEPTH{-\dp#1}%
+ \adjcalc@settobp\WIDTH{\wd#1}%
+ \adjcalc@settobp\RADIUSTL{#2}%
+ \adjcalc@settobp\RADIUSTR{#3}%
+ \adjcalc@settobp\RADIUSBL{#4}%
+ \adjcalc@settobp\RADIUSBR{#5}%
+ \adjcalc@settobp\RADIUSTLb{\tc@bezfacn#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTL{\ht#1-#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTLb{\ht#1-\tc@bezfacn#2}%
+ \adjcalc@settobp\HEIGHTmRADIUSTR{\ht#1-#3}%
+ \adjcalc@settobp\HEIGHTmRADIUSTRb{\ht#1-\tc@bezfacn#3}%
+ \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}%
+ \adjcalc@settobp\WIDTHmRADIUSTRb{\wd#1-\tc@bezfacn#3}%
+ \adjcalc@settobp\RADIUSBRmDEPTH{#5-\dp#1}%
+ \adjcalc@settobp\RADIUSBRmDEPTHb{\tc@bezfacn#5-\dp#1}%
+ \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}%
+ \adjcalc@settobp\WIDTHmRADIUSBRb{\wd#1-\tc@bezfacn#5}%
+ \adjcalc@settobp\RADIUSBLmDEPTH{#4-\dp#1}%
+ \adjcalc@settobp\RADIUSBLmDEPTHb{\tc@bezfacn#4-\dp#1}%
+ \adjcalc@settobp\RADIUSBLb{\tc@bezfacn#4}%
+ \adjcalc@settobp\LINEWIDTH{\fboxrule}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@clip@roundedbox@pdfcode}
+% \begin{macrocode}
+\def\@clip@roundedboxpath@pdfcode{%
+ 0 \HEIGHTmRADIUSTL m
+ 0 \HEIGHTmRADIUSTLb \RADIUSTLb \HEIGHT \RADIUSTL \HEIGHT c
+ \WIDTHmRADIUSTR \HEIGHT l
+ \WIDTHmRADIUSTRb \HEIGHT \WIDTH \HEIGHTmRADIUSTRb \WIDTH \HEIGHTmRADIUSTR c
+ \WIDTH \RADIUSBRmDEPTH l
+ \WIDTH \RADIUSBRmDEPTHb \WIDTHmRADIUSBRb \DEPTH \WIDTHmRADIUSBR \DEPTH c
+ \RADIUSBL \DEPTH l
+ \RADIUSBLb \DEPTH 0 \RADIUSBLmDEPTHb 0 \RADIUSBLmDEPTH c
+ 0 \RADIUSBLmDEPTH l
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}
+% Clips round corners off.
+% \begin{macrocode}
+\def\@clipcornersofbox#1#2#3#4#5{%
+ \setbox#1=\hbox{%
+ \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}%
+ \special{pdf:content q }%
+ \special{pdf:literal direct
+ \@clip@roundedboxpath@pdfcode
+ h W n
+ }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \special{pdf:content q }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \hbox to 0pt{\copy#1\hss}%
+ \special{pdf:literal direct Q }%
+ \special{pdf:literal direct Q }%
+ \hskip\wd#1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>}
+% Round frame around a box.
+% \begin{macrocode}
+\def\@rndframearoundbox#1#2#3#4#5#6{%
+ \setbox#1=\hbox{%
+ \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+ \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}%
+ \edef\@tempa{#6}%
+ \ifx\@empty\@tempa\else
+ \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}%
+ \fi
+ %
+ \hbox to 0pt{\copy#1\hss}%
+ \hbox to 0pt{%
+ \color@setgroup
+ \adjbox@rndframe@color
+ \special{pdf:content q }%
+ \special{pdf:literal direct
+ \LINEWIDTH w
+ \@clip@roundedboxpath@pdfcode
+ h s
+ }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \special{pdf:content q }%
+ \special{pdf:literal direct -1 0 0 -1 0 0 cm }%
+ \special{pdf:literal direct Q }%
+ \special{pdf:literal direct Q }%
+ \color@endgroup
+ }%
+ \hskip\wd#1%
+ }%
+ \adjsetlength\@tempdima{.5\fboxrule}%
+ \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-xetex.def>
+% \fi
+%
+% \Finale
+% \endinput
+%
+% ^^A Standalone figures:
+%
+% \iffalse
+%<*box.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+\begin{tikzpicture}[font=\sffamily,>=latex]
+ \newcommand\Cs[1]{\texttt{\scriptsize\textbackslash #1}}
+% Save example text in box
+ \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture}
+ \def\HEIGHT{\ht\mybox}
+ \def\WIDTH{\wd\mybox}
+ \def\DEPTH{\dp\mybox}
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0) node [above,midway] {baseline};
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+ \draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \tikzset{inner sep=5pt}
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [pos=1.1,left,align=left]
+ {depth\\\Cs{depth}\\\Cs{dp}\Cs{br}};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [pos=.4,left,align=left]
+ {height\\\Cs{height}\\\Cs{ht}\Cs{br}};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right,align=left]
+ {totalheight\\\Cs{totalheight}};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below,align=left]
+ {width\\\Cs{width}\\\Cs{wd}\Cs{br}};
+ \fill (-2.5ex,0) circle (.5pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</box.tex>
+% \fi
+%
+% \iffalse
+%<*compare.tex>
+% \fi
+\documentclass{article}
+\usepackage[margin=1cm,paperwidth=20cm,paperheight=100cm]{geometry}
+\usepackage[]{xcolor}
+\usepackage[export]{adjustbox}
+%\listfiles
+\fboxsep=0pt
+\parskip=1cm
+
+\usepackage[tightpage]{preview}
+
+\usepackage{standalone}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{tikz}
+\newdimen\unit
+\tikzset{unit/.code={\unit=\dimexpr#1\relax}}
+\tikzset{xy/.style={x={#1},y={#1},unit={#1},font={\sffamily\fontsize{.2\unit}{.24\unit}\selectfont},line width=.01\unit}}
+
+\def\showdiff#1{%
+ {%
+ \diff=\dimexpr#10-#11\relax
+ \pgfmathsetlength\absdiff{abs(\diff)}%
+ \ifdim\diff=0pt%
+ \textcolor{green}{PASSED}%
+ \else
+ \ifdim\absdiff<\Epsilon
+ \pgfmathtruncatemacro\FCOLOR{100*(\Epsilon-abs(\absdiff))/\Epsilon}%
+ \textcolor{green!\FCOLOR!yellow}{OK: \the\diff}%
+ \else
+ \textcolor{red}{FAILED: \the\diff}%
+ \fi
+ \fi
+ \quad
+ \ifdim#11=0pt
+ \diff=#10
+ \else
+ \pgfmathsetlength\diff{(#10/#11) - 1pt}
+ \fi
+ \ifdim\diff<0pt
+ \absdiff=-\diff
+ \else
+ \absdiff=\diff
+ \fi
+ \ifdim\diff=0pt%
+ \textcolor{green}{PASSED}%
+ \else
+ \ifdim\absdiff<\dEpsilon
+ \pgfmathtruncatemacro\FCOLOR{100*(\dEpsilon-abs(\absdiff))/\dEpsilon}%
+ \textcolor{green!\FCOLOR!yellow}{OK: \the\diff}%
+ \else
+ \textcolor{red}{FAILED: \the\diff}%
+ \fi
+ \fi
+ }%
+}
+
+\newlength\diff
+\newlength\absdiff
+\newlength\Epsilon
+\newlength\dEpsilon
+\Epsilon=0.05pt
+\dEpsilon=0.001pt
+\def\test#1#2{%
+ \begin{preview}%
+ \sbox0{\includegraphics[#1]{#2}}%
+ \sbox1{\adjustbox{#1}{\input{#2}\unskip}}%
+ \begin{tabular}{ll@{}l}
+ \usebox0 & \usebox1 & .\\
+ \the\ht0 & \the\ht1 & \showdiff\ht \\
+ \the\dp0 & \the\dp1 & \showdiff\dp \\
+ \the\wd0 & \the\wd1 & \showdiff\wd \\
+ \end{tabular}%
+ \end{preview}%
+}
+
+\begin{document}
+\ttfamily
+
+\test{}{gridbp}
+
+\test{}{gridpt}
+
+\test{clip,trim=10bp 20bp 0 0,width=177bp,frame=1pt 1pt}{gridbp}
+
+\test{clip,trim=10pt 20pt 0 0,width=177pt,frame=1pt 1pt}{gridpt}
+
+\test{angle=45,clip,trim=10bp 0 0 0,width=177bp,totalheight=5cm,frame}{gridbp}
+
+\test{clip,trim=10pt 0 0 0,angle=90,trim=5pt 0 0 0}{gridbp}
+
+\test{angle=180,totalheight=5cm}{gridbp}
+
+\test{width=3cm,angle=0,totalheight=5cm}{gridbp}
+
+\test{width=3cm,totalheight=5cm,angle=180}{gridbp}
+
+\test{width=3cm,totalheight=5cm}{gridbp}
+
+\test{margin=.5cm .5cm .5cm .5cm,frame}{gridbp}
+\end{document}
+
+\test{width=2cm,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame,angle=5,
+margin=.1cm .1cm .1cm .1cm,frame
+}{gridbp}
+
+\test{width=2cm,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+margin=1pt 1pt 1pt 1pt,frame,angle=1,
+}{gridbp}
+
+
+\end{document}
+
+\adjustbox{width=2cm,trim={.5\WIDTH} 0 0 0,frame}{Ag}
+% \iffalse
+%</compare.tex>
+% \fi
+%
+% \iffalse
+%<*margin2.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Save example text in box
+ \def\text{\scalebox{10}{Xy}}
+ \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture}
+ \def\HEIGHT{\ht\mybox}
+ \def\WIDTH{\wd\mybox}
+ \def\DEPTH{\dp\mybox}
+ \def\LLX{.15\WIDTH}
+ \def\LLY{.5\DEPTH}
+ \def\URX{.15\WIDTH}
+ \def\URY{.25\HEIGHT}
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \begin{scope}[blue,every node/.append style={inner sep=2pt}]
+ \begin{scope}
+ \draw ([shift={(-\LLX,-\LLY)}]0,-\DEPTH) rectangle ([shift={(\URX,\URY)}]\WIDTH,\HEIGHT);
+%\node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY);
+%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY);
+ \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,.5*\HEIGHT-.5*\DEPTH) -- ++(-\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw [->] (.5\WIDTH,\HEIGHT) -- ++(0,\URY) node [right,midway] {\scriptsize ury};
+ \draw [->] (\WIDTH,.5*\HEIGHT-.5*\DEPTH) -- ++(\URX,0) node [above,midway] {\scriptsize urx};
+ \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly};
+ \draw (-\LLX,-\LLY) -- ([shift={(+\URX,0)}]\WIDTH,-\LLY);
+ \path [fill=white,draw] (-\LLX,-\LLY) circle (1pt);
+ \draw [->] (.5\WIDTH,0pt) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly};
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</margin2.tex>
+% \fi
+%
+% \iffalse
+%<*margin.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\newsavebox\mybox
+
+\begin{document}
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+%</standalone>
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Save example text in box
+ \def\text{\scalebox{10}{Xy}}
+ \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture}
+ \def\HEIGHT{\ht\mybox}
+ \def\WIDTH{\wd\mybox}
+ \def\DEPTH{\dp\mybox}
+ \def\LLX{.15\WIDTH}
+ \def\LLY{.5\DEPTH}
+ \def\URX{.15\WIDTH}
+ \def\URY{.25\HEIGHT}
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \begin{scope}[blue,every node/.append style={inner sep=2pt}]
+ \begin{scope}
+ \draw ([shift={(-\LLX,-\LLY)}]0,-\DEPTH) rectangle ([shift={(\URX,\URY)}]\WIDTH,\HEIGHT);
+%\node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY);
+%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY);
+ \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,.5*\HEIGHT-.5*\DEPTH) -- ++(-\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw (-\LLX,0) -- ([shift={(+\URX,0)}]\WIDTH,0);
+ \draw [->] (.5\WIDTH,\HEIGHT) -- ++(0,\URY) node [right,midway] {\scriptsize ury};
+ \draw [->] (\WIDTH,.5*\HEIGHT-.5*\DEPTH) -- ++(\URX,0) node [above,midway] {\scriptsize urx};
+ \path [fill=white,draw] (-\LLX,0) circle (1pt);
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</margin.tex>
+% \fi
+%
+% \iffalse
+%<*trim2.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{adjustbox}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+
+% Save example text in box
+\def\text{\sffamily\scalebox{10}{Xy}}
+\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}}
+\def\HEIGHT{\ht\mybox}
+\def\WIDTH{\wd\mybox}
+\def\DEPTH{\dp\mybox}
+\def\LLX{.15\WIDTH}
+\def\LLY{\DEPTH+.15\HEIGHT}
+\def\URX{.15\WIDTH}
+\def\URY{.25\HEIGHT}
+%
+%\usebox\mybox
+%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width};
+ \fill (-2.5ex,0) circle (.5pt);
+ \begin{scope}[blue] %,every node/.append style={inner sep=2pt}]
+ \begin{scope}
+ \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY);
+%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY);
+ \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY);
+ \draw [->] (\LLX+.2\WIDTH,-\DEPTH+\LLY) -- (\LLX+.2\WIDTH,0) node [right,midway] {\scriptsize moves down};
+ \path [fill=white,draw] (\LLX,-\DEPTH+\LLY) circle (1pt);
+ \draw [->]
+ ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [left,midway] {\scriptsize ury}
+ ;
+ \draw [->]
+ ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [below,midway] {\scriptsize urx}
+ ;
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</trim2.tex>
+% \fi
+%
+% \iffalse
+%<*trim3.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{adjustbox}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+
+% Save example text in box
+\def\text{\sffamily\scalebox{10}{Xy}}
+\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}}
+\def\HEIGHT{\ht\mybox}
+\def\WIDTH{\wd\mybox}
+\def\DEPTH{\dp\mybox}
+\def\LLX{.15\WIDTH}
+\def\LLY{.4\DEPTH}
+\def\URX{.15\WIDTH}
+\def\URY{(\HEIGHT+.25\DEPTH)}
+%
+%\leavevmode
+%\rlap{\hbox to \wd\mybox{\hrulefill}}\usebox\mybox
+%\rlap{\hbox to \wd\mybox{\hrulefill}}\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}
+%\sbox0{\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}}%
+%ht=\the\ht0, dp=\the\dp0, wd=\the\wd0
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width};
+ \fill (-2.5ex,0) circle (.5pt);
+ \begin{scope}[blue] %,every node/.append style={inner sep=2pt}]
+ \begin{scope}
+ \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,{-\URY});
+%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY);
+ \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY);
+ \draw [->] (\LLX+.2\WIDTH,{\HEIGHT-\URY}) -- (\LLX+.2\WIDTH,0) node [pos=0.4,below right] {\scriptsize moves up};
+ \path [fill=white,draw] (\LLX,{\HEIGHT-\URY}) circle (1pt);
+ \draw [->]
+ ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [left,midway] {\scriptsize ury}
+ ;
+ \draw [->]
+ ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [below,midway] {\scriptsize urx}
+ ;
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</trim3.tex>
+% \fi
+%
+% \iffalse
+%<*trim.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Save example text in box
+ \def\text{\scalebox{10}{Xy}}
+ \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture}
+ \def\HEIGHT{\ht\mybox}
+ \def\WIDTH{\wd\mybox}
+ \def\DEPTH{\dp\mybox}
+ \def\LLX{.15\WIDTH}
+ \def\LLY{.5\DEPTH}
+ \def\URX{.15\WIDTH}
+ \def\URY{.25\HEIGHT}
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width};
+ \fill (-2.5ex,0) circle (.5pt);
+ \begin{scope}[blue,every node/.append style={inner sep=2pt}]
+ \begin{scope}
+ \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY);
+%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY);
+ \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw (\LLX,0) -- ([shift={(-\URX,0)}]\WIDTH,0);
+ \draw [->]
+ ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [left,midway] {\scriptsize ury}
+ ;
+ \draw [->]
+ ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [below,midway] {\scriptsize urx}
+ ;
+ \path [fill=white,draw] (\LLX,0) circle (1pt);
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</trim.tex>
+% \fi
+%
+% \iffalse
+%<*viewport2.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{adjustbox}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+
+% Save example text in box
+\def\text{\sffamily\scalebox{10}{Xy}}
+\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}}
+\def\HEIGHT{\ht\mybox}
+\def\WIDTH{\wd\mybox}
+\def\DEPTH{\dp\mybox}
+\def\LLX{.15\WIDTH}
+\def\LLY{\DEPTH-.15\HEIGHT}
+\def\URX{.15\WIDTH}
+\def\URY{.25\HEIGHT}
+%
+%\usebox\mybox
+%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width};
+ \fill (-2.5ex,0) circle (.5pt);
+ \begin{scope}[blue]
+ \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+ \begin{scope}[blue]
+ \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \draw (\LLX,0) -- ([shift={(-\URX,0)}]\WIDTH,0);
+ \path [fill=white,draw] (\LLX,0) circle (1pt);
+ \end{scope}
+ \begin{scope}[blue!50!black] %,every node/.append style={inner sep=2pt}]
+%\draw [->,.!45] (0,0) -- ++(-\URX+\WIDTH,-\URY+\HEIGHT);
+%\draw [->,.!45] (0,0) -- ++(\LLX,\LLY-\DEPTH);
+ \draw [->] (\LLX,0) -- (\LLX,\LLY-\DEPTH) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw [->]
+ ([shift={(-\URX,0)}]\WIDTH,0) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [right,midway] {\scriptsize ury}
+ ;
+ \draw [->]
+ ([shift={(0,-\URY)}]0,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [above,midway] {\scriptsize urx}
+ ;
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</viewport2.tex>
+% \fi
+%
+% \iffalse
+%<*viewport.tex>
+% \fi
+%<*standalone>
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{adjustbox}
+\newsavebox\mybox
+
+\begin{document}
+%</standalone>
+% Diagram of the TeX box model and its dimensions
+% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011
+% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0
+
+% Save example text in box
+\def\text{\sffamily\scalebox{10}{Xy}}
+\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}}
+\def\HEIGHT{\ht\mybox}
+\def\WIDTH{\wd\mybox}
+\def\DEPTH{\dp\mybox}
+\def\LLX{.15\WIDTH}
+\def\LLY{\DEPTH+.15\HEIGHT}
+\def\URX{.15\WIDTH}
+\def\URY{.25\HEIGHT}
+%
+%\usebox\mybox
+%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}
+\begin{tikzpicture}[font=\sffamily,>=latex]
+% Extensions lines for dimensions (drawn here to be below other material)
+ \draw [gray,thin]
+ (0,0) -- +(-3.5ex,0)
+ (0,\HEIGHT) -- +(-3.5ex,0)
+ (0,-\DEPTH) -- +(-3.5ex,0)
+ (\WIDTH,\HEIGHT) -- +(3.5ex,0)
+ (\WIDTH,-\DEPTH) -- +(3.5ex,0)
+ (0,-\DEPTH) -- +(0,-3.5ex)
+ (\WIDTH,-\DEPTH) -- +(0,-3.5ex)
+ ;
+% Text node:
+ \node [inner sep=0pt,anchor=base west] {\usebox\mybox};
+% Baseline
+ \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline};
+%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin};
+% Dimensions
+ \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth};
+ \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height};
+ \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight};
+ \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width};
+ \fill (-2.5ex,0) circle (.5pt);
+ \begin{scope}[blue]
+ \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text};
+ \end{scope}
+ \begin{scope}[blue]
+%\draw [->,.!45] (0,0) -- ++(-\URX+\WIDTH,-\URY+\HEIGHT);
+%\draw [->,.!45] (0,0) -- ++(\LLX,\LLY-\DEPTH);
+ \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT);
+ \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY);
+ \draw [->] (\LLX+.2\WIDTH,-\DEPTH+\LLY) -- (\LLX+.2\WIDTH,0) node [right,midway] {\scriptsize moves down};
+ \path [fill=white,draw] (\LLX,-\DEPTH+\LLY) circle (1pt);
+ \end{scope}
+ \begin{scope}[blue!50!black] %,every node/.append style={inner sep=2pt}]
+ \draw [->] (\LLX,0) -- (\LLX,\LLY-\DEPTH) node [right,midway] {\scriptsize lly};
+ \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx};
+ \draw [->]
+ ([shift={(-\URX,0)}]\WIDTH,0) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [right,midway] {\scriptsize ury}
+ ;
+ \draw [->]
+ ([shift={(0,-\URY)}]0,\HEIGHT) --
+ ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT)
+ node [above,midway] {\scriptsize urx}
+ ;
+ \end{scope}
+% Box
+ \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT);
+% Origin
+ \path [fill=white,draw=black] (0,0) circle (1pt);
+% Center inner box
+ \path let
+ \p1 = (current bounding box.south west),
+ \p2 = (current bounding box.north east),
+ \p3 = (0,-\DEPTH),
+ \p4 = (\WIDTH,\HEIGHT)
+ in
+ (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4);
+\end{tikzpicture}
+%<*standalone>
+\end{document}
+%</standalone>
+% \iffalse
+%</viewport.tex>
+% \fi
+%
diff --git a/macros/latex/contrib/adjustbox/trimclip.pdf b/macros/latex/contrib/adjustbox/trimclip.pdf
new file mode 100644
index 0000000000..2ad59ec6b4
--- /dev/null
+++ b/macros/latex/contrib/adjustbox/trimclip.pdf
Binary files differ