summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/adjustbox
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-05-16 23:09:50 +0000
committerKarl Berry <karl@freefriends.org>2012-05-16 23:09:50 +0000
commit5b130c1b3fb6521ac46fd1693c41b50073e53b3c (patch)
treec3ad3bc751b0bcb459e5c5dfa65276d24ae76351 /Master/texmf-dist/source/latex/adjustbox
parent7a5a358a5c53a22bbfb2fd761f69849b9d5237de (diff)
adjustbox 1.0 (16may12)
git-svn-id: svn://tug.org/texlive/trunk@26452 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/adjustbox')
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/adjcalc.dtx413
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx3413
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/adjustbox.ins21
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/trimclip.dtx1944
4 files changed, 3919 insertions, 1872 deletions
diff --git a/Master/texmf-dist/source/latex/adjustbox/adjcalc.dtx b/Master/texmf-dist/source/latex/adjustbox/adjcalc.dtx
new file mode 100644
index 00000000000..912802fc1bf
--- /dev/null
+++ b/Master/texmf-dist/source/latex/adjustbox/adjcalc.dtx
@@ -0,0 +1,413 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011-2012 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{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{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}{\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/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx b/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
index 0f200d23afd..5c5eb67e5c7 100644
--- a/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
+++ b/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%<=*COPYRIGHT>
-%% Copyright (C) 2011 by Martin Scharrer <martin@scharrer.me>
-%% ------------------------------------------------------------------
+%% Copyright (C) 2011-2012 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.
@@ -20,14 +20,16 @@
%<=/COPYRIGHT>
% \fi
%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ^^A DRIVER (((
% \iffalse
%<*driver>
\ProvidesFile{adjustbox.dtx}[%
%<=*DATE>
- 2011/11/14
+ 2012/05/16
%<=/DATE>
%<=*VERSION>
- v0.8
+ v0.9
%<=/VERSION>
DTX file for the adjustbox package]
\documentclass[a4paper]{ydoc}[2011/08/11]
@@ -42,7 +44,6 @@
\GetFileInfo{adjustbox.dtx}
\usepackage{adjustbox}[\filedate]
\usepackage{tikz}
-\normalmarginpar
\renewenvironment{example}[1][Example:]{%
\subsubsection*{#1}%
@@ -142,7 +143,9 @@
\end{document}
%</driver>
% \fi
-%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ^^A Title page (((
% \CheckSum{0}
%
% \CharacterTable
@@ -190,6 +193,9 @@
% 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}{
+%
+% }
%
% \GetFileInfo{adjustbox.dtx}
%
@@ -197,6 +203,7 @@
%
% \author{Martin Scharrer}
% \email{martin@scharrer-online.de}
+% \repository{https://bitbucket.org/martin_scharrer/adjustbox}
% \ydocpdfsettings
% \maketitle
%
@@ -206,171 +213,162 @@
% \makeatother
%
% \begin{abstract}
-% This package got inspired by the \pkg{graphics/x} package and extends it sets of macros and generalises its key=value syntax for graphics to arbitray \TeX\ material.
-% Its main feature is the \Macro\adjustbox macro and the corresponding \env{adjustbox} environment which allow to adjust arbitrary \TeX\ material
-% in a multitude of ways, similar like \Macro\includegraphics does it for image files. In addition to this a wide set of dedicated macros are provided to modify a box.
-% This startet with the two macros \Macro\trimbox and \Macro\clipbox which are missing in \pkg{graphics} but was extended over time.
-%
-% The macros use the \pkg{collectbox} package to allow for verbatim content. Equivalent environments are also provided.
-% The trim operation is now implemented in \TeX\ and the clip operation uses |pdftex| primitives if available.
-% Otherwise the \pkg{pgf} package is used for clipping, which supports both DVI/PS and PDF output.
-% \\
-% \textcolor{yellow}{This package is still a little new and its implementation might not be fully stable yet.}
+% 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}
%
-% \section{Introduction}
-% 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.
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \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.
+% 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.
-%
-% \subsection{Driver dependent implementation}
-% Certain operations, like clipping, depend on the output driver used, because they must be implemented as part of the output format, e.g. PDF instructions for a PDF output file.
-% The trim operation is now implemented as driver independent \TeX\ code.
-% The clip operation now uses |pdftex| primitives if possible, which are taken from the |pdftex| driver file of \pkg{graphics}.
-% For other output formats a \env{pgfpicture} environment from the \pkg{pgf} package is used,
-% which supports both PS and PDF output and comes which is own clipping drivers.
-% All \LaTeX\ compilers should be supported, but |pdflatex| is the main target of the author.
-%
-% \subsection{Dependencies}
-% The \pkg{adjustbox} package requires the author's other package \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/\env{stackbox}.
-% 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.
-%
-% \section{Package Option}\label{sec:options}
-% Following v0.5 from 2011/08/13 this package accepts the following package options. Some of them can also be used as
-% optional keys for macros.
+% 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. 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 )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Package Options}\label{sec:options} ^^A (((
+% This package accepts the following options:
%
% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
-% \oitem{minimal} Only define the minimal set of macros, i.e.\ \Macro\trimbox, \Macro\clipbox and \Macro\adjustbox as
-% with previous versions before v0.5.
-% \oitem{export} Export the now keys of \Macro\adjustbox also to \Macro\includegraphics so that they can be used for
-% images as well. This option is meaningless if \opt{minimal} was used.
-% \oitem{pgf} Uses the \pkg{pgf} package for all clip operations. This overrides all automatically detected drivers.
-% At the moment only a |pdftex| driver is provided, all other compilers and output formats use this option already.
-% \oitem{PGF} Uses the \pkg{pgf} package for clip operations and configures the macros to parse lengths using
-% \pkg{pgfmath} (compare with the \opt{pgf} option below).
+% \oitem{export} Exports most keys of \Macro\adjustbox to \Macro\includegraphics so that they can be used with this
+% macro as well.
+% \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 can be used either as package options and as keys for \Macro\adjustbox\relax (but not for \Macro\includegraphics
-% even if the \opt{export} option was used) to change the settings locally.
-% The only difference between these two usages is that they also load required packages when used as package options.
-% Therefore all keys used in the document should be loaded as package options first or the required packages must be loaded
-% manually. (It is also possible to disable the advanced parsing of lengths using the \opt{none} option, but this is not recommended.)
+% 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. 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{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}
%
-% One further option exists which can also be used as optional key for \Macro\adjustbox\relax (but not for
-% \Macro\includegraphics):
-% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]}
-% \oitem{defaultunit}\MacroArgs'='<unit>\relax
-% This sets the default unit used for the values of \Macro\trimbox, \Macro\clipbox and \Macro\marginbox
-% including there starred versions
-% as well as all related keys like \Key{trim}, \Key{viewport}, \Key{margin}, \Key{trim}, \Key{viewport}, \Key{Clip} and \Key{Clip*}.
-% 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}
-%
-% \subsection{Verbatim Support}\label{sec:verbatim}
-% The macros read the content as a horizontal \TeX{} box and not as an macro argument in order to support verbatim content.
-% This functionality is now provided as dedicated package \pkg{collectbox} which can also be used independently.
-% This means that the braces around the content can also be written as \Macro\bgroup and \Macro\egroup:
-% \begin{macroquote}
-% \trimbox{1 2 3 4}\AlsoMacro\bgroup~<content>\AlsoMacro\egroup
-% \end{macroquote}
-% Special care is taken to allow the \meta{text} to be a single macro (except \Macro\bgroup) without any braces:
-% \begin{macroquote}
-% \clipbox{1 2 3 4}\AlsoMacro\somemacro
-% \end{macroquote}
-% This is to support the questionable habit of some \LaTeX{} users to drop the braces for single token arguments.
-% All environments support verbatim content.
-%
-% \section{Usage}
-% This sections explains the existing features of this package.
-% Most features are available as matching macro, environment and key.
+% \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 )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \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.
-% Also the plain\TeX{} syntax for environments (|\foobar ... \endfoobar|) can not be used
-% because it will trigger \Macro\foobar as a macro.
%
-% \subsection{Adjust Box Content}
+% \subsection{Adjust Box Content} ^^A (((2
% \vskip-\lastskip
-% \DescribeMacro\adjustbox{<key/value pairs>}{<content>}
-% The \Macro\adjustbox macro is the general form of all box modifying macros mentioned in the introduction.
-% It can be thought as an extended \Macro\includegraphics for \LATeX{} material.
-% It supports the same \meta{key/value pairs} and many more. However, they are provided as a mandatory not as an optional argument.
-% An \Macro\adjustbox without options would not make sense and can be replaced by a simple \Macro\mbox.
+% \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.
-% ^^ASee also \autoref{tab:alternatives} for a comparison of \Macro\adjustbox
-% ^^Awith the other macros.
%
% \DescribeEnv[<content>]{adjustbox}{<key=value, \ldots>}
-% The environment version of \Macro\adjustbox.
+% The environment version of \Macro\adjustbox. A difference to the macro is that it includes \Macro\noindent
+% to suppress paragraph indention.
%
-% \subsubsection*{Adjust Images}
-% \DescribeMacro\adjustimage{<key/value pairs>}{<image filename>}
+% \Needspace*{5\baselineskip}
+% \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>}}.
-% The \Macro\adjustimage macro is a wrapper for this. However, it does not use \Macro\includegraphics directly, but an internal macro, to allow the redefinition
-% of it.
-% This does not require the \opt{export} option and therefore helps to avoid option clashes
+% 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.
-% This macro allows to use all features of \Macro\adjustbox on images, however any `|[ ]|' inside the optional argument must be wrapped in `|{ }|' to mask them.
-% It is possible to redefine \Macro\includegraphics to use/be \Macro\adjincludegraphics and this is done by
+% 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).
%
-% \subsubsection{Setting keys globally}
%
+% \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.
+% 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.
+% 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}
@@ -400,167 +398,184 @@
% \end{codequote}
% \end{examples}
%
-% \subsubsection{Argument Values}\label{sec:argval}
-% All\marginpar{Parsing} length values given in the arguments of all macros and keys provided by this package are parsed by and advanced version of
-% \Macro\setlength (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.
+% ^^A )))2
+% \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\marginpar{Space=Separator} 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 "{ }".
+% 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.
+% 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.
+% 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.
%
% \subsubsection*{Default unit}
-% If no unit is provided for of the bounding box coordinates (llx, lly, urx, ury) 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).
-%
-%
-%
-%
-% \subsection{Trimming and Clipping}
-% Material can be trimmed (the official size is made smaller, so the remaining material
-% laps over the official boundaries) and clipped (overlapping material is not displayed).
-% The original keys provided by \pkg{graphicx} are also mentioned here for comparison.
-%
-%
-% \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 using all four values must be specified.
-%
-%
-% \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.
+% If no unit is provided for of the bounding box coordinates (llx, lly, urx, ury) 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 )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \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}'='<llx>~<lly>~<urx>~<ury>
% \DescribeKey{trim}'='<all sites>
% \DescribeKey{trim}'='<left/right>~<top/bottom>
-% This key represents the original \Key{trim} key of \Macro\includegraphics.
-% It always trims the original content independent from its position.
+% 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.
+% The key trims the given amounts 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).
%
% \DescribeKey{viewport}'='<llx>~<lly>~<urx>~<ury>
% 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}'='<llx>~<lly>~<urx>~<ury>
% \DescribeKey{Trim}'='<all sites>
% \DescribeKey{Trim}'='<left/right>~<top/bottom>
% \DescribeKey{Viewport}'='<llx>~<lly>~<urx>~<ury>
-% The normal \Key{trim} and \Key{viewport} keys
-% as described earlier are applied on the original content before any resizing
-% or other effects. This is because for \Macro\includegraphics the trimming is done by the internal graphic driver,
+% 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 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.
-%
-%
-% \DescribeMacro\clipbox{<all sites>}{<content>}
-% \DescribeMacro\clipbox{<left/right>~<top/bottom>}{<content>}
-% \DescribeMacro\clipbox{<llx>~<lly>~<urx>~<ury>}{<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.
-% It might 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 \Key{viewport}.
+% 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.
%
-% \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.
-%
-%
-% \DescribeKey{clip}
-% 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.
%
% \DescribeKey{Clip}'='<llx>~<lly>~<urx>~<ury>
% \DescribeKey{Clip}'='<all sites>
% \DescribeKey{Clip}'='<left/right>~<top/bottom>
% \DescribeKey{Clip*}'='<llx>~<lly>~<urx>~<ury>
-% As stated above the \Key{clip} boolean key
-% which will make the default \Key{trim} and \Key{viewport} keys clip the trimmed content, has no effect
-% on the \Key{trim} and \Key{viewport} keys. Instead \Key{Clip} and \Key{Clip*} are provided which wrap the content internally in a \Macro\clipbox or
-% \Macro\clipbox*\relax macro. They can be used several times.
+% 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.
%
%
-% \subsection{Margins}
%
-% \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>}
-% \Descsep
+% ^^A )))2
+% \subsection{Margins and Vertical Spacing} ^^A (((2
+% \vspace{-\baselineskip}
+%
% \DescribeKey{margin}'='<all sites>
% \DescribeKey{margin}'='<left/right>~<top/bottom>
% \DescribeKey{margin}'='<llx>~<lly>~<urx>~<ury>
-% This feature can be used to add a margin (white space) around the content. It can be seen as the opposite of \Macro\trim.
+% 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{lly} is added to the depth.
-% It is also available as \env{marginbox} environment and also usable as \Key{margin} option (see below).
+% 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 \fbox{\marginbox{1ex 2ex 3ex 4ex}{Text}} After
+% Before \adjustbox{padding=1ex 2ex 3ex 4ex,frame,margin=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>}
-% \Descsep
% \DescribeKey{margin*}'='<all sites>
% \DescribeKey{margin*}'='<left/right>~<top/bottom>
% \DescribeKey{margin*}'='<llx>~<lly>~<urx>~<ury>
-% 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 instead of the original baseline is preserved.
-% Note that while \Macro\marginbox is basically the opposite of \Macro\trim, \Macro\marginbox* is not the opposite of \Macro\trim*.
-% Instead it also takes the same values as the normal value and not view port values like \Macro\trim*.
+% This starred version is almost identical to the normal \Key{margin} key, 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 \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 \fbox{\marginbox*{1ex 2ex 3ex 4ex}{Text}} After
+% 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
+% \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.
+%
%
-% \subsection{Minimum and Maximum Size}
%
% \DescribeMacro\minsizebox{<width>}{<height>}{<content>}
% \DescribeMacro\minsizebox'*'{<width>}{<totalheight>}{<content>}
@@ -570,7 +585,7 @@
% 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} options.
+% 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}
@@ -591,7 +606,6 @@
% \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
@@ -600,7 +614,7 @@
% 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} options.
+% 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}
@@ -621,36 +635,10 @@
% \end{examples}
%
%
-% \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.
-%
-%
-% \subsubsection{Scaling}
-%
-% \DescribeMacro\scalebox{<h-factor>}[<v-factor>]{<content>}
-% With only the mandatory argument the content is evenly scaled accordantly to the given factor. With the optional argument
-% a different vertical scaling factor can be given.
-% This macro is provided by the loaded \pkg{graphicx} package and only mentioned here for the sake of completeness.
-% The content is read as normal macro argument and therefore can't hold verbatim or similar special material.
-% An alternative which boxes the content directly is provided by the author's other package \pkg{realboxes} as \Macro\Scalebox and
-% as \env{Scalebox} environment.
+% ^^A )))2
+% \Needspace*{8\baselineskip}
+% \subsection{Scaling} ^^A (((2
+% \vspace{-\baselineskip}
%
% \DescribeKey{scale}'='<factor>
% \DescribeKey{scale}'='{<h-factor>}{<v-factor>}
@@ -666,18 +654,11 @@
% \end{examplecode}
% \end{examples}
%
-% \DescribeMacro\reflectbox{<content>}
-% Reflects the content like \Macro\scalebox{-1}[1] would do.
-% This macro is provided by the loaded \pkg{graphicx} package and only mentioned here for the sake of completeness.
-% The content is read as normal macro argument and therefore can't hold verbatim or similar special material.
-% An alternative which boxes the content directly is provided by the author's other package \pkg{realboxes} as \Macro\Reflectbox and
-% as \env{Reflectbox} environment.
%
% \DescribeKey{reflect}
-% This reflects the content by using \Macro\reflectbox internally, which is identical to \Macro\scalebox{-1}[1],
+% 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!}
@@ -685,7 +666,15 @@
% \end{examples}
%
%
-% \subsubsection{Frame}
+% \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
+% \subsection{Frame} ^^A (((2
+% The following keys can be used to draw frames around the content.
%
% \DescribeKey{fbox}
% \DescribeKey{fbox}'='<rule width>
@@ -703,19 +692,17 @@
% \adjustbox{fbox=1pt}{With 1pt rule width}
% \end{examplecode}
% \begin{examplecode}
-% \adjustbox{fbox=1pt 2pt}
-% {With 1pt rule width and 2pt separation}
+% \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}
+% \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}
+% \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>
@@ -730,6 +717,7 @@
% \end{examplecode}
% \end{examples}
%
+%
% \DescribeKey{cfbox}'='<color>
% \DescribeKey{cfbox}'='<color>~<rule width>
% \DescribeKey{cfbox}'='<color>~<rule width>~<sep>
@@ -738,11 +726,11 @@
% 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}
+% \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>
@@ -757,7 +745,9 @@
% \end{example}
%
%
-% \subsection{Vertical Alignment}
+% ^^A )))2
+% \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|
@@ -882,7 +872,9 @@
% \end{example}
%
%
-% \subsection{Horizontal Alignment}
+% ^^A )))2
+% \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>
@@ -957,10 +949,56 @@
% If the content is wider than the available width it will stick into the outer inner without causing an overfull hbox warning.
%
%
-% \subsection{Lapping}
+% \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
@@ -1016,52 +1054,10 @@
% \end{examples}
%
%
-% \DescribeKey{lap}'='<lap amount>
-% \DescribeKey{lap}'='{<length>}{<lap amount>}
-% This wraps the content into a
-% \Macro\lapbox{<lap amount>}{\ldots} and
-% \Macro\lapbox[<length>]{<lap amount>}{\ldots}, respectively. Positive \meta{amounts} lap the content to the right
-% and negative to the left. The optional \meta{length} argument allows to set the final width.
-%
-% \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}
-%
-%
-%
-% \subsubsection{Background}
+% ^^A )))3
+% ^^A )))2
+% \subsection{Background} ^^A (((2
+% \vspace{-\baselineskip}
%
% \DescribeKey{bgcolor}'='<color>
% \DescribeKey{bgcolor}'='{<model>}{<color>}
@@ -1106,7 +1102,13 @@
% \DescribeMacro{\bgimagebox}[<key=value pairs>]{<image filename>}
% Standalone version of the \Key{bgimage} key. Also available as \env{bgimagebox} environment.
%
-% \subsubsection{Pixel size}
+%
+% ^^A )))2
+% \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
@@ -1138,7 +1140,8 @@
% \end{example}
%
%
-% \subsection{Minipage or other inner environments which change the processing of the content}\label{sec:inner}
+% ^^A )))2
+% \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.
@@ -1264,7 +1267,10 @@
% \end{examplecode}
% \end{example}
%
-% \subsection{Adding own Code or Environments}
+% ^^A )))2
+% \Needspace*{8\baselineskip}
+% \subsection{Adding own Code or Environments} ^^A (((2
+% \vspace{-\baselineskip}
%
% \DescribeKey{env}'='<environment name>
% \DescribeKey{env}'='{<environment name>}<environment options>
@@ -1294,7 +1300,18 @@
% Only previously used special keys for modifying the boxing of the content will have an effect yet. % All other keys are not yet processed.
%
%
-% \section{Other}
+% ^^A )))2
+% \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.
@@ -1307,8 +1324,56 @@
% \end{example}
%
%
-% \StopEventually{}
-% \subsection{Experimental Keys}
+% \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
+% \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
+% \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.
%
@@ -1343,18 +1408,21 @@
%
%
%
+% ^^A )))2
+% \StopEventually{}
%
% \clearpage
-% \section{Implementation}
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Implementation} ^^A (((
% \setcounter{lstnumber}{1}
%
-%
% \iffalse
%<*adjustbox.sty>
% \fi
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsection{Package header, options and dependencies}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Package header, options and dependencies} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \begin{macrocode}
%<!COPYRIGHT>
\ProvidesPackage{adjustbox}[%
@@ -1366,45 +1434,70 @@
Adjusting TeX boxes (trim, clip, ...)]
% \end{macrocode}
%
+% Load the packages required for the options.
% \begin{macrocode}
\RequirePackage{xkeyval}
+\RequirePackage{adjcalc}
+% \end{macrocode}
%
-\def\adjbox@defaultunit{bp}
-\DeclareOptionX<adjbox>{defaultunit}{%
- \def\adjbox@defaultunit{#1}%
- \begingroup
- \def\@tempa{none}%
- \expandafter\endgroup
- \ifx\@tempa\adjbox@defaultunit
- \def\adjbox@default{\adjsetlength}%
- \fi
+% 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}
%
-\def\adjbox@fam{adjbox}
-\DeclareOptionX<adjbox>{export}{\def\adjbox@fam{Gin}}
-\DeclareOptionX<adjbox>{Export}{\AtEndOfPackage{\let\includegraphics\adjincludegraphics}}
-\DeclareOptionX<adjbox>{patch}{\AtEndOfPackage{\RequirePackage{adjgrfx}}}
-\DeclareOptionX<adjbox>{minimal}{\let\adjbox@maybeend\endinput}
+% 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}
%
-\def\adjbox@driver{adj\Gin@driver}
-\DeclareOptionX<adjbox>{pgf}{\def\adjbox@driver{adjpgf.def}}
-\DeclareOptionX<adjbox>{PGF}{\def\adjbox@driver{adjpgf.def}\adjcalc@pgfmath}
-\DeclareOptionX<adjbox>*{\PassOptionsToPackage\CurrentOption{graphicx}}
+% 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}
%
-\let\adjbox@maybeend\relax
-\input{adjcalc.sty}
-\disable@keys{adjbox}{patch,export,PGF,minimal}
+% 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}
-\RequirePackage{graphicx}[1999/02/16]
-\RequirePackage{collectbox}[2011/08/22]
+\ProcessOptionsX*<Adjbox>\relax
% \end{macrocode}
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsection{Basic commands}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Load the required packages.
+% \begin{macrocode}
+\RequirePackage{trimclip}
+\RequirePackage{graphicx}[1999/02/16]
+\RequirePackage{collectbox}[2012/05/13]
+% \end{macrocode}
%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Basic commands} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{macro}{\adjustboxset}
% \begin{macrocode}
@@ -1455,165 +1548,6 @@
% \end{macro}
%
%
-% \begin{key}{adjbox}{viewport}
-% \begin{macrocode}
-\define@key{adjbox}{viewport}{%
- \def\adjustbox@content{%
- \adjbox@parse@v{#1}%
- \adjbox@@viewport
- \adjustbox@@@trimclip
- }%
-}
-% \end{macrocode}
-% \end{key}
-%
-%
-% \begin{key}{adjbox}{trim}
-% \begin{macrocode}
-\define@key{adjbox}{trim}{%
- \def\adjustbox@content{%
- \adjbox@parse@v{#1}%
- \adjustbox@@@trimclip
- }%
-}
-% \end{macrocode}
-% \end{key}
-%
-%
-% \begin{macro}{\adjustbox@@@trimclip}
-% \begin{macrocode}
-\def\adjustbox@@@trimclip{%
- \ifGin@clip
- \expandafter\@clipbox
- \else
- \expandafter\@trimbox
- \fi
- \adjbox@tllx
- \adjbox@tlly
- \adjbox@turx
- \adjbox@tury
- \collectedbox
- \usebox\collectedbox
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\adjbox@parse@v}
-% \begin{macrocode}
-\def\adjbox@parse@v#1{%
- \adjbox@parse@@v#1 {} {} {} \\%
-}
-\def\adjbox@parse@@v#1 #2 #3 #4 #5\\{%
- \adjbox@default\adjbox@tllx{#1}%
- \ifx\@nnil#2\@nnil
- \adjbox@tlly\adjbox@tllx
- \adjbox@turx\adjbox@tllx
- \adjbox@tury\adjbox@tlly
- \else
- \adjbox@default\adjbox@tlly{#2}%
- \ifx\@nnil#3\@nnil
- \adjbox@turx\adjbox@tllx
- \adjbox@tury\adjbox@tlly
- \else
- \adjbox@default\adjbox@turx{#3}%
- \adjbox@default\adjbox@tury{#4}%
- \fi
- \fi
-}%
-%%\newdimen\adjbox@llx
-%%\newdimen\adjbox@lly
-%%\newdimen\adjbox@urx
-%%\newdimen\adjbox@ury
-\newdimen\adjbox@tllx
-\newdimen\adjbox@tlly
-\newdimen\adjbox@turx
-\newdimen\adjbox@tury
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\adjbox@@viewport}
-% Turns viewport coordinates into trim coordinates.
-% \begin{macrocode}
-\def\adjbox@@viewport{%
- %\advance\adjbox@tllx by -\z@
- \advance\adjbox@tlly by \dp\collectedbox
- \advance\adjbox@turx by -\wd\collectedbox
- \advance\adjbox@tury by -\ht\collectedbox
- \adjbox@turx=-\adjbox@turx
- \adjbox@tury=-\adjbox@tury
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\trimbox}
-% \begin{macrocode}
-\newcommand\trimbox{%
- \collectboxcheckenv{trimbox}%
- \@ifstar
- \trimbox@s
- \trimbox@
-}
-\def\trimbox@#1{%
- \collectbox{\trimbox@@\@trimbox{#1}}%
-}
-\def\trimbox@s#1{%
- \collectbox{\trimbox@@{\adjbox@@viewport\@trimbox}{#1}}%
-}
-\def\trimbox@@#1#2{%
- \adjbox@parse@v{#2}%
- #1%
- \adjbox@tllx
- \adjbox@tlly
- \adjbox@turx
- \adjbox@tury
- \collectedbox
- \usebox\collectedbox
-}
-% \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{\trimbox@@\@clipbox{#1}}%
-}
-\def\clipbox@s#1{%
- \collectbox{\trimbox@@{\adjbox@@viewport\@clipbox}{#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}{\adjustbox}
% Now processes the keys before the box is read to allow for parbox or similar modes.
@@ -1626,7 +1560,14 @@
% The typesetting of the content is finally done by executing the token register.
% \begin{macrocode}
\newcommand\adjustbox[1]{%
+ \begingroup
+ \edef\adjbox@line{\the\inputlineno}%
+ \let\collectbox@mode\relax
+ \let\collectbox@noindent\relax
\collectboxcheckenv{adjustbox}%
+ \ifcollectboxenv\else
+ \let\adjustbox@noindent\relax
+ \fi
\begingroup
\adjbox@setkeys{#1}%
\expandafter\expandafter\expandafter
@@ -1648,6 +1589,7 @@
\def\adjbox@setkeys{%
\setkeys*{ADJBOX}%
}
+\let\adjustbox@noindent\noindent
% \end{macrocode}
% \end{environment}
%
@@ -1669,9 +1611,11 @@
\@tempswatrue
\toks@{{\adjustbox@content}}%
\def\setlength{\adjsetlength}%
- \setkeys{adjbox,Gin}{#1}%
+ \setkeys{adjbox,Gin,adjcalc}{#1}%
\adjbox@esetsize
+ \adjustbox@noindent
\the\toks@
+ \endgroup
}
% \end{macrocode}
% \end{macro}
@@ -1753,240 +1697,92 @@
% \end{macro}
%
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsubsection{Low-level trim and clip boxes}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% \begin{macro}{\@trimbox}[5]{<tllx>}{<tlly>}{<turx>}{<tury>}{<box register>
-% 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#5=\hbox{%
- \adjsetlength\@tempdima{#1}%
- \hskip-\@tempdima
- \adjsetlength\@tempdima{\dp#5 - (#2)}%
- \adjsetlength\@tempdimb{\wd#5 - (#3)}%
- \adjsetlength\@tempdimc{\ht#5 - (#4)}%
- \dp#5=\@tempdima
- \wd#5=\@tempdimb
- \ht#5=\@tempdimc
- \ifdim\dp#5<\z@
- \raise\dp#5%
- \else
- \ifdim\ht#5<\z@
- \lower\ht#5%
- \fi\fi
- \box#5%
- }%
- \ifdim\dp#5<\z@ \dp#5=\z@ \fi
- \ifdim\wd#5<\z@ \wd#5=\z@ \fi
- \ifdim\ht#5<\z@ \ht#5=\z@ \fi
-}
-% \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.
+% End input of file if the \opt{minimal} option was used.
% \begin{macrocode}
-\def\@clipbox#1#2#3#4#5{%
- \@trimbox{#1}{#2}{#3}{#4}{#5}%
- \@cliptoboxdim{#5}%
-}
+{\csname adjustbox@minimal\endcsname}
% \end{macrocode}
-% \end{macro}
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsection{Driver}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% 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{macrocode}
-\InputIfFileExists{\adjbox@driver}{%
- \PackageInfo{adjustbox}{Using driver '\adjbox@driver'.}%
-}{%
- \input{adjpgf.def}%
- \PackageInfo{adjustbox}{Using fall-back PGF driver.}
-}
-% \end{macrocode}
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Internal code adding macros} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-%
-% Stop here if 'minimal' option was used.
-% \begin{macrocode}
-\adjbox@maybeend
-% \end{macrocode}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsection{More box commands}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% \begin{macro}{\phantombox}[3]{width}{height}{depth}
-% Produces an empty box with the given width, height and depth.
+% \begin{macro}{\adjbox@Gin@add}
% \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
+\def\adjbox@Gin@add#1{%
+ \def\@tempa{#1}%
+ \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}}%
}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\minsizebox}
-% \begin{macrocode}
-\newcommand*\minsizebox{%
- \collectboxcheckenv{minsizebox}%
- \@ifstar{\@minsizebox\totalheight}{\@minsizebox\height}%
+\def\adjbox@Gin@Add{%
+ \Gin@esetsize
+ \@tempswatrue
+ \adjbox@Gin@add
}
% \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{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}
-\newcommand*\@minsizebox[3]{%
- \@collectbox{\@minmaxsizebox>#1{#2}{#3}}%
+\def\adjbox@Gin@sizeadd#1#2#3\relax{%
+ \ifx\@nnil#3\@nnil
+ \adjbox@Gin@add{#1{#2}{#2}}%
+ \else
+ \adjbox@Gin@add{#1{#2}{#3}}%
+ \fi
}
% \end{macrocode}
% \end{macro}
%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Keys for trimming, clipping, viewport and margin} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% \begin{macro}{\maxsizebox}
-% \begin{macrocode}
-\newcommand*\maxsizebox{%
- \collectboxcheckenv{maxsizebox}%
- \@ifstar{\@maxsizebox\totalheight}{\@maxsizebox\height}%
-}
-% \end{macrocode}
-% \end{macro}
%
-% \begin{environment}{maxsizebox*}
+% \begin{key}{adjbox}{viewport}
% \begin{macrocode}
-\expandafter\newcommand\expandafter*\csname maxsizebox*\endcsname{%
- \@collectboxisenv{maxsizebox*}%
- \@maxsizebox\totalheight
+\define@key{adjbox}{viewport}{%
+ \def\adjustbox@content{%
+ \@trimclip{%
+ \ifGin@clip
+ \expandafter\@clipvpbox
+ \else
+ \expandafter\@viewportbox
+ \fi
+ }{#1}%
+ }%
}
% \end{macrocode}
-% \end{environment}
+% \end{key}
%
%
-% \begin{macro}{\@maxsizebox}
+% \begin{key}{adjbox}{Viewport}
% \begin{macrocode}
-\newcommand*\@maxsizebox[3]{%
- \@collectbox{\@minmaxsizebox<#1{#2}{#3}}%
+\define@key\adjbox@fam{Viewport}{%
+ \adjbox@Gin@Add{\trimbox@s{#1}}%
}
% \end{macrocode}
-% \end{macro}
-%
+% \end{key}
%
-% \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}%
- \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\@tempb#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\@tempa#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{key}{adjbox}{trim}
% \begin{macrocode}
- \ifdim\@tempa#1\width
- \ifdim\@tempb#1#2%
- 3%
- \else
- 2%
- \fi
+\define@key{adjbox}{trim}{%
+ \def\adjustbox@content{%
+ \@trimclip{%
+ \ifGin@clip
+ \expandafter\@clipbox
\else
- \ifdim\@tempb#1#2%
- 1%
- \fi
+ \expandafter\@trimbox
\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
- \adjsetlength\@tempdima\@tempb
- \Gscale@div\@tempa\@tempdima#2%
- \Gscale@box\@tempa[\@tempa]\BOXCONTENT
-% \end{macrocode}
-% Case 2: width needs scaling. Calculate factor and scale the content with it.
-% \begin{macrocode}
- \or
- \adjsetlength\@tempdima\@tempa
- \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
- \adjsetlength\@tempdima\@tempa
- \Gscale@div\@tempa\@tempdima\width
- \adjsetlength\@tempdima\@tempb
- \Gscale@div\@tempb\@tempdima#2%
- \ifdim\@tempa\p@#1\@tempb\p@
- \let\@tempb\@tempa
- \else
- \let\@tempa\@tempb
- \fi
- \Gscale@box\@tempa[\@tempb]\BOXCONTENT
- \fi
+ }{#1}%
+ }%
}
% \end{macrocode}
-% \end{macro}
-%
-%
+% \end{key}
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsection{New \cs{includegraphics} and \cs{adjustbox} options}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{Trim}
% \begin{macrocode}
@@ -1996,13 +1792,6 @@
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{Viewport}
-% \begin{macrocode}
-\define@key\adjbox@fam{Viewport}{%
- \adjbox@Gin@Add{\trimbox@s{#1}}%
-}
-% \end{macrocode}
-% \end{key}
%
% \begin{key}{adjbox}{Clip}
% \begin{macrocode}
@@ -2012,6 +1801,7 @@
% \end{macrocode}
% \end{key}
%
+%
% \begin{key}{adjbox}{Clip*}
% \begin{macrocode}
\define@key\adjbox@fam{Clip*}{%
@@ -2021,159 +1811,46 @@
% \end{key}
%
%
-% \begin{key}{adjbox}{frame}
-% As 0--3 arguments: rule width, (inner) separation and margin.
+% \begin{key}{adjbox}{margin}
% \begin{macrocode}
-\define@key\adjbox@fam{frame}[{{\fboxrule}}]{%
- \adjbox@frame{\fboxsep\z@}#1 {} {} \relax\relax\@nnil
+\define@key\adjbox@fam{margin}{%
+ \adjbox@Gin@Add{\marginbox@{#1}}%
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{fbox}
-% Same as \Key{frame} but with different default separation.
+% \begin{key}{adjbox}{margin*}
% \begin{macrocode}
-\define@key\adjbox@fam{fbox}[{{\fboxrule}}]{%
- \adjbox@frame{}#1 {} {} {} \relax\relax\@nnil
+\define@key\adjbox@fam{margin*}{%
+ \adjbox@Gin@Add{\marginbox@s{#1}}%
}
% \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{key}{adjbox}{padding}
+% Alias for \Key{margin}.
% \begin{macrocode}
-\define@key\adjbox@fam{cframe}{%
- \adjbox@checkcolor
- \adjbox@cframe{\fboxsep\z@}#1 {} {} {} \relax\relax\@nnil
+\define@key\adjbox@fam{padding}{%
+ \adjbox@Gin@Add{\marginbox@{#1}}%
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{cfbox}
+% \begin{key}{adjbox}{padding*}
+% Alias for \Key{margin*}.
% \begin{macrocode}
-\define@key\adjbox@fam{cfbox}{%
- \adjbox@checkcolor
- \adjbox@cframe{}#1 {} {} {} \relax\relax\@nnil
+\define@key\adjbox@fam{padding*}{%
+ \adjbox@Gin@Add{\marginbox@s{#1}}%
}
% \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, envrionment 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\adjbox@tllx{\fboxrule + \fboxsep}%
- \@marginbox
- \adjbox@tllx
- \adjbox@tllx
- \adjbox@tllx
- \adjbox@tllx
- \collectedbox
- \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\adjbox@tllx{#4}%
- \@marginbox
- \adjbox@tllx
- \adjbox@tllx
- \adjbox@tllx
- \adjbox@tllx
- \collectedbox
- \BOXCONTENT
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\adjbox@boxframe}
-% 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{Scaling and rotating keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{scale}
% \begin{macrocode}
@@ -2231,103 +1908,119 @@
% \end{key}
%
%
-% \begin{key}{adjbox}{lap}
-% \begin{macrocode}
-\define@key\adjbox@fam{lap}{%
- \@ifnextchar\bgroup{%
- \adjbox@lapbox
- }{%
- \adjbox@lapbox{#1}{}%
- }#1{}{}\@nnil
-}
-% \end{macrocode}
-% \end{key}
%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Horizontal alignment keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% \begin{macro}{\adjbox@lapbox}
+% \begin{macro}{\adjbox@halign}
% \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
+\def\adjbox@halign#1#2#3{%
+ \Gin@esetsize
+ \@tempswatrue
+ \adjsetlength\@tempdima{#1}%
+ \edef\@tempa{\leavevmode\hb@xt@\the\@tempdima}%
+ \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\expandafter#2\the\toks@#3}}%
}
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{key}{adjbox}{rlap}
+% \begin{key}{adjbox}{center}
% \begin{macrocode}
-\define@key\adjbox@fam{rlap}[]{%
- \adjbox@Gin@Add{\lapbox{\width}}%
+\define@key\adjbox@fam{center}[\linewidth]{%
+ \adjbox@halign{#1}\hss\hss
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{llap}
+% \begin{key}{adjbox}{left}
% \begin{macrocode}
-\define@key\adjbox@fam{llap}[]{%
- \adjbox@Gin@Add{\lapbox{-\width}}%
+\define@key\adjbox@fam{left}[\linewidth]{%
+ \adjbox@halign{#1}\relax\hss
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{margin}
+% \begin{key}{adjbox}{right}
% \begin{macrocode}
-\define@key\adjbox@fam{margin}{%
- \adjbox@Gin@Add{\marginbox@{#1}}%
+\define@key\adjbox@fam{right}[\linewidth]{%
+ \adjbox@halign{#1}\hss\relax
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{margin*}
+% \begin{key}{adjbox}{outer}
% \begin{macrocode}
-\define@key\adjbox@fam{margin*}{%
- \adjbox@Gin@Add{\marginbox@s{#1}}%
+\define@key\adjbox@fam{outer}[\linewidth]{%
+ \def\@tempa{\adjbox@halign{#1}}%
+ \if@twoside
+ \adjbox@ifoddpage
+ {\@tempa\hss\relax}%
+ {\@tempa\relax\hss}%
+ \else
+ \@tempa\hss\hss
+ \fi
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{dpi}
+% \begin{key}{adjbox}{inner}
% \begin{macrocode}
-\define@key\adjbox@fam{dpi}{%
- \adjsetlength\pdfpxdimen{1in/(#1)}%
+\define@key\adjbox@fam{inner}[\linewidth]{%
+ \def\@tempa{\adjbox@halign{#1}}%
+ \if@twoside
+ \adjbox@ifoddpage
+ {\@tempa\relax\hss}%
+ {\@tempa\hss\relax}%
+ \else
+ \@tempa\hss\hss
+ \fi
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{pxdim}
+% \begin{macro}{\adjbox@ifoddpage}
% \begin{macrocode}
-\define@key\adjbox@fam{pxdim}{%
- \adjsetlength\pdfpxdimen{#1}%
+\def\adjbox@ifoddpage{%
+ \begingroup
+ \adjbox@checkoddpage
+ \expandafter\endgroup
+ \ifoddpage
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
}
% \end{macrocode}
-% \end{key}
+% \end{macro}
%
%
+% \begin{macro}{\adjbox@checkoddpage}
% \begin{macrocode}
-\define@key\adjbox@fam{execute}{%
- #1%
-}
+\def\adjbox@checkoddpage{%
+ \ifodd\c@page
+ \oddpagetrue
+ \else
+ \oddpagefalse
+ \fi
+}%
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
-\define@key\adjbox@fam{@debug}[]{%
- \showthe\toks@
-}
+\newif\ifoddpage
+\AtBeginDocument{%
+ \@ifpackageloaded{changepage}{\let\adjbox@checkoddpage\checkoddpage}%
+ {\@ifpackageloaded{chngpage}{\let\adjbox@checkoddpage\checkoddpage}{}}%
+}%
% \end{macrocode}
%
-% \begin{macrocode}
-\define@key{ADJBOX}{Execute}{%
- #1%
-}
-% \end{macrocode}
%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Vertical alignment keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{adjbox}{raise}
% \begin{macrocode}
@@ -2372,10 +2065,10 @@
% \begin{macrocode}
\def\adjbox@@raisebox#1#2#3{%
\ifx\@nnil#1\@nnil
- \setbox\@tempboxa\box\collectedbox
+ \setbox\@tempboxa\copy\collectedbox
\else
\adjsetlength\@tempdima{#1}%
- \sbox\@tempboxa{\raise\@tempdima\box\collectedbox}%
+ \setbox\@tempboxa\hbox{\raise\@tempdima\copy\collectedbox}%
\fi
\ifx\@nnil#2\@nnil\else
\adjsetlength\@tempdima{#2}%
@@ -2478,456 +2171,824 @@
% \end{macro}
%
%
-% \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>}.
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Set vertical sizes} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{set height}
% \begin{macrocode}
-\define@key\adjbox@fam{bgcolor}{%
- \adjbox@checkcolor
- \@ifnextchar\bgroup{%
- \adjbox@bgcolor
- }{%
- \adjbox@bgcolor{}{#1}%
- }#1\@nnil
+\define@key\adjbox@fam{set height}{%
+ \adjbox@Gin@Add{\adjbox@raisebox{}{#1}{}}%
}
% \end{macrocode}
% \end{key}
%
%
-% \begin{macro}{\adjbox@bgcolor}
-% Parses the two possible arguments and adds the background color macro
-% to the token register.
+% \begin{key}{adjbox}{set depth}
% \begin{macrocode}
-\def\adjbox@bgcolor#1#2#3\@nnil{%
- \ifx\@nnil#1\@nnil
- \adjbox@Gin@add{\@collectbox{\adjbox@@bgcolor{\color{#2}}}}%
+\define@key\adjbox@fam{set depth}{%
+ \adjbox@Gin@Add{\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@key\adjbox@fam{set vsize}{%
+ \adjbox@Gin@Add{\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
- \adjbox@Gin@add{\@collectbox{\adjbox@@bgcolor{\color[#1]{#2}}}}%
+ \adjust@addcode{\par\vspace#4{#1}\noindent}{\par\vspace#4{#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.
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Minimum and maximum size keys and macros} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{min width}
% \begin{macrocode}
-\define@key\adjbox@fam{bgcolor*}{%
- \adjbox@checkcolor
- \adjbox@Gin@add{\@collectbox{\adjbox@@bgcolor{#1}}}%
+\define@key\adjbox@fam{min width}{%
+ \adjbox@Gin@Add{\@minsizebox\height{#1}!}%
}
% \end{macrocode}
% \end{key}
%
%
-% \begin{macro}{\adjbox@@bgcolor}
-% 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.
+% \begin{key}{adjbox}{max width}
+% \begin{macrocode}
+\define@key\adjbox@fam{max width}{%
+ \adjbox@Gin@Add{\@maxsizebox\height{#1}!}%
+}
+% \end{macrocode}
+% \end{key}
%
-% The argument contains the color macro, e.g.\ \Macro\color{<color>}.
+%
+% \begin{key}{adjbox}{min height}
% \begin{macrocode}
-\def\adjbox@@bgcolor#1{%
- \mbox{%
- \hbox{%
- #1%
- \vrule\@width\width\@height\height\@depth\depth%
- }%
- \hskip-\width
- \BOXCONTENT
- }%
-}%
+\define@key\adjbox@fam{min height}{%
+ \adjbox@Gin@Add{\@minsizebox\height!{#1}}%
+}
% \end{macrocode}
-% \end{macro}
+% \end{key}
%
%
-% \begin{key}{adjbox}{set height}
+% \begin{key}{adjbox}{max height}
% \begin{macrocode}
-\define@key\adjbox@fam{set height}{%
- \adjbox@Gin@Add{\adjbox@raisebox{}{#1}{}}%
+\define@key\adjbox@fam{max height}{%
+ \adjbox@Gin@Add{\@maxsizebox\height!{#1}}%
}
% \end{macrocode}
% \end{key}
%
%
-% \begin{key}{adjbox}{set depth}
+% \begin{key}{adjbox}{min totalheight}
% \begin{macrocode}
-\define@key\adjbox@fam{set depth}{%
- \adjbox@Gin@Add{\adjbox@raisebox{}{}{#1}}%
+\define@key\adjbox@fam{min totalheight}{%
+ \adjbox@Gin@Add{\@minsizebox\totalheight!{#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{key}{adjbox}{max totalheight}
% \begin{macrocode}
-\define@key\adjbox@fam{set vsize}{%
- \adjbox@Gin@Add{\adjbox@raisebox{}#1}%
+\define@key\adjbox@fam{max totalheight}{%
+ \adjbox@Gin@Add{\@maxsizebox\totalheight!{#1}}%
}
% \end{macrocode}
% \end{key}
%
%
+% \begin{key}{adjbox}{min size}
+% \begin{macrocode}
+\define@key\adjbox@fam{min size}{%
+ \adjbox@Gin@sizeadd{\@minsizebox\height}#1\relax
+}
+% \end{macrocode}
+% \end{key}
+%
%
-% \begin{macro}{\adjbox@Gin@add}
+% \begin{key}{adjbox}{max size}
% \begin{macrocode}
-\def\adjbox@Gin@add#1{%
- \def\@tempa{#1}%
- \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}}%
+\define@key\adjbox@fam{max size}{%
+ \adjbox@Gin@sizeadd{\@maxsizebox\height}#1\relax
}
-\def\adjbox@Gin@Add{%
- \Gin@esetsize
- \@tempswatrue
- \adjbox@Gin@add
+% \end{macrocode}
+% \end{key}
+%
+%
+% \begin{key}{adjbox}{min totalsize}
+% \begin{macrocode}
+\define@key\adjbox@fam{min totalsize}{%
+ \adjbox@Gin@sizeadd{\@minsizebox\totalheight}#1\relax
+}
+% \end{macrocode}
+% \end{key}
+%
+%
+% \begin{key}{adjbox}{max totalsize}
+% \begin{macrocode}
+\define@key\adjbox@fam{max totalsize}{%
+ \adjbox@Gin@sizeadd{\@maxsizebox\totalheight}#1\relax
+}
+% \end{macrocode}
+% \end{key}
+%
+% \begin{key}{adjbox}{warn width}
+% \begin{macrocode}
+\define@key\adjbox@fam{warn width}[\linewidth]{%
+ \adjust@addcode{\@collectbox{%
+ \@tempdima=#1\relax
+ \ifdim\width>\@tempdima
+ \advance\@tempdima by -\width
+ \@tempdima=-\@tempdima
+ \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{key}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \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}{\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{macro}{\@minsizebox}
% \begin{macrocode}
-\def\adjbox@Gin@sizeadd#1#2#3\relax{%
- \ifx\@nnil#3\@nnil
- \adjbox@Gin@add{#1{#2}{#2}}%
- \else
- \adjbox@Gin@add{#1{#2}{#3}}%
- \fi
+\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{macro}{\adjbox@halign}
+% \begin{environment}{maxsizebox*}
% \begin{macrocode}
-\def\adjbox@halign#1#2#3{%
- \Gin@esetsize
- \@tempswatrue
- \adjsetlength\@tempdima{#1}%
- \edef\@tempa{\hb@xt@\the\@tempdima}%
- \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\expandafter#2\the\toks@#3}}%
+\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{key}{adjbox}{center}
+%
+% \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}
-\define@key\adjbox@fam{center}[\linewidth]{%
- \adjbox@halign{#1}\hss\hss
+\newcommand*\@minmaxsizebox[4]{%
+ \edef\@tempa{#3}%
+ \edef\@tempb{#4}%
+ \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\@tempb#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\@tempa#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\@tempa#1\width
+ \ifdim\@tempb#1#2%
+ 3%
+ \else
+ 2%
+ \fi
+ \else
+ \ifdim\@tempb#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
+ \adjsetlength\@tempdima\@tempb
+ \Gscale@div\@tempa\@tempdima#2%
+ \Gscale@box\@tempa[\@tempa]\BOXCONTENT
+% \end{macrocode}
+% Case 2: width needs scaling. Calculate factor and scale the content with it.
+% \begin{macrocode}
+ \or
+ \adjsetlength\@tempdima\@tempa
+ \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
+ \adjsetlength\@tempdima\@tempa
+ \Gscale@div\@tempa\@tempdima\width
+ \adjsetlength\@tempdima\@tempb
+ \Gscale@div\@tempb\@tempdima#2%
+ \ifdim\@tempa\p@#1\@tempb\p@
+ \let\@tempb\@tempa
+ \else
+ \let\@tempa\@tempb
+ \fi
+ \Gscale@box\@tempa[\@tempb]\BOXCONTENT
+ \fi
}
% \end{macrocode}
-% \end{key}
+% \end{macro}
%
-% \begin{key}{adjbox}{left}
+%
+% ^^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{left}[\linewidth]{%
- \adjbox@halign{#1}\relax\hss
+\define@key\adjbox@fam{frame}[{{\fboxrule}}]{%
+ \adjbox@frame{\fboxsep\z@}#1 {} {} \relax\relax\@nnil
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{right}
+%
+% \begin{key}{adjbox}{fbox}
+% Same as \Key{frame} but with different default separation.
% \begin{macrocode}
-\define@key\adjbox@fam{right}[\linewidth]{%
- \adjbox@halign{#1}\hss\relax
+\define@key\adjbox@fam{fbox}[{{\fboxrule}}]{%
+ \adjbox@frame{}#1 {} {} {} \relax\relax\@nnil
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{outer}
+%
+% \begin{macro}{\adjbox@frame}
% \begin{macrocode}
-\define@key\adjbox@fam{outer}[\linewidth]{%
- \def\@tempa{\adjbox@halign{#1}}%
- \if@twoside
- \adjbox@ifoddpage
- {\@tempa\hss\relax}%
- {\@tempa\relax\hss}%
- \else
- \@tempa\hss\hss
- \fi
+\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}{inner}
+% \begin{key}{adjbox}{cfbox}
% \begin{macrocode}
-\define@key\adjbox@fam{inner}[\linewidth]{%
- \def\@tempa{\adjbox@halign{#1}}%
- \if@twoside
- \adjbox@ifoddpage
- {\@tempa\relax\hss}%
- {\@tempa\hss\relax}%
- \else
- \@tempa\hss\hss
- \fi
+\define@key\adjbox@fam{cfbox}{%
+ \adjbox@checkcolor
+ \adjbox@cframe{}#1 {} {} {} \relax\relax\@nnil
}
% \end{macrocode}
% \end{key}
%
-% \begin{macro}{\adjbox@ifoddpage}
+% \begin{macro}{\adjbox@cframe}
% \begin{macrocode}
-\def\adjbox@ifoddpage{%
- \begingroup
- \adjbox@checkoddpage
- \expandafter\endgroup
- \ifoddpage
- \expandafter\@firstoftwo
+\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
- \expandafter\@secondoftwo
+ \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@checkoddpage}
+% \begin{macro}{\adjbox@@frame}[4]{content}{rule width}{separation}{margin}
% \begin{macrocode}
-\def\adjbox@checkoddpage{%
- \ifodd\c@page
- \oddpagetrue
- \else
- \oddpagefalse
+\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}
-\newif\ifoddpage
-\AtBeginDocument{%
- \@ifpackageloaded{changepage}{\let\adjbox@checkoddpage\checkoddpage}%
- {\@ifpackageloaded{chngpage}{\let\adjbox@checkoddpage\checkoddpage}{}}%
-}%
+\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}
%
-% \begin{key}{adjbox}{min width}
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Density keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{dpi}
% \begin{macrocode}
-\define@key\adjbox@fam{min width}{%
- \adjbox@Gin@Add{\@minsizebox\height{#1}!}%
+\define@key\adjbox@fam{dpi}{%
+ \adjsetlength\pdfpxdimen{1in/(#1)}%
}
% \end{macrocode}
% \end{key}
%
-%
-% \begin{key}{adjbox}{max width}
+% \begin{key}{adjbox}{pxdim}
% \begin{macrocode}
-\define@key\adjbox@fam{max width}{%
- \adjbox@Gin@Add{\@maxsizebox\height{#1}!}%
+\define@key\adjbox@fam{pxdim}{%
+ \adjsetlength\pdfpxdimen{#1}%
}
% \end{macrocode}
% \end{key}
%
%
-% \begin{key}{adjbox}{min height}
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Code keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
% \begin{macrocode}
-\define@key\adjbox@fam{min height}{%
- \adjbox@Gin@Add{\@minsizebox\height!{#1}}%
+\define@key\adjbox@fam{execute}{%
+ #1%
}
% \end{macrocode}
-% \end{key}
%
+% \begin{macrocode}
+\define@key\adjbox@fam{@debug}[]{%
+ \showthe\toks@
+}
+% \end{macrocode}
%
-% \begin{key}{adjbox}{max height}
% \begin{macrocode}
-\define@key\adjbox@fam{max height}{%
- \adjbox@Gin@Add{\@maxsizebox\height!{#1}}%
+\define@key{ADJBOX}{Execute}{%
+ #1%
}
% \end{macrocode}
-% \end{key}
%
%
-% \begin{key}{adjbox}{min totalheight}
+% \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@fam{min totalheight}{%
- \adjbox@Gin@Add{\@minsizebox\totalheight!{#1}}%
+\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}{max totalheight}
+% \begin{key}{adjbox}{precode}
% \begin{macrocode}
-\define@key\adjbox@fam{max totalheight}{%
- \adjbox@Gin@Add{\@maxsizebox\totalheight!{#1}}%
+\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}{min size}
+% \begin{key}{adjbox}{appcode}
% \begin{macrocode}
-\define@key\adjbox@fam{min size}{%
- \adjbox@Gin@sizeadd{\@minsizebox\height}#1\relax
+\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}{max size}
+% \begin{key}{adjbox}{env}
+% Adds environment around boxed content
% \begin{macrocode}
-\define@key\adjbox@fam{max size}{%
- \adjbox@Gin@sizeadd{\@maxsizebox\height}#1\relax
+\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}
+%
%
-% \begin{key}{adjbox}{min totalsize}
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Background keys and macros} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \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{min totalsize}{%
- \adjbox@Gin@sizeadd{\@minsizebox\totalheight}#1\relax
+\define@key\adjbox@fam{bgcolor}{%
+ \adjbox@checkcolor
+ \@ifnextchar\bgroup{%
+ \adjbox@bgcolor
+ }{%
+ \adjbox@bgcolor{}{#1}%
+ }#1\@nnil
}
% \end{macrocode}
% \end{key}
%
%
-% \begin{key}{adjbox}{max totalsize}
+% \begin{macro}{\adjbox@bgcolor}
+% Parses the two possible arguments and adds the background color macro
+% to the token register.
% \begin{macrocode}
-\define@key\adjbox@fam{max totalsize}{%
- \adjbox@Gin@sizeadd{\@maxsizebox\totalheight}#1\relax
+\def\adjbox@bgcolor#1#2#3\@nnil{%
+ \ifx\@nnil#1\@nnil
+ \adjbox@Gin@add{\@collectbox{\adjbox@@bgcolor{\color{#2}}}}%
+ \else
+ \adjbox@Gin@add{\@collectbox{\adjbox@@bgcolor{\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{\adjbox@@bgcolor{#1}}}%
}
% \end{macrocode}
% \end{key}
%
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsubsection{Lap box}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \begin{macro}{\adjbox@@bgcolor}
+% 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.
%
-% \begin{macro}{\lapbox}
+% The argument contains the color macro, e.g.\ \Macro\color{<color>}.
% \begin{macrocode}
-\newcommand*\lapbox[2][\width-\@tempdimb]{%
- \collectboxcheckenv{lapbox}%
- \@collectbox{\@lapbox{#1}{#2}}%
-}
+\def\adjbox@@bgcolor#1{%
+ \mbox{%
+ \hbox{%
+ #1%
+ \vrule\@width\width\@height\height\@depth\depth%
+ }%
+ \hskip-\width
+ \BOXCONTENT
+ }%
+}%
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@lapbox}
+%
+% \begin{macro}{\bgimagebox}
% \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
+\newcommand*\bgimagebox[2][]{%
+ \collectboxcheckenv{bgimagebox}%
+ \@collectbox{\@bgimagebox{#1}{#2}}%
}
% \end{macrocode}
% \end{macro}
%
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsubsection{Margin box}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% \begin{macro}{\marginbox}[1]{Margins as space separated values (like for 'trim')}
-% Collect box first.
+% \begin{macro}{\@bgimagebox}
% \begin{macrocode}
-\newcommand\marginbox{%
- \collectboxcheckenv{marginbox}%
- \@ifstar
- \marginbox@s
- \marginbox@
+\def\@bgimagebox#1#2{%
+ \mbox{%
+ \lower\depth\hbox{%
+ \edef\@tempa{\noexpand\adjustimage
+ {#1,width=\the\width,totalheight=\the\totalheight}%
+ {#2}%
+ }%
+ \@tempa
+ }%
+ \hskip-\width%
+ \BOXCONTENT
+ }%
}
-\def\marginbox@#1{%
- \@collectbox{\marginbox@@{#1}}%
+% \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
}
-\def\marginbox@s#1{%
- \@collectbox{\marginbox@@s{#1}}%
+% \end{macrocode}
+% \end{key}
+%
+%
+% \begin{macro}{\adjbox@bgimage}
+% \begin{macrocode}
+\def\adjbox@bgimage#1#2#3\@nnil{%
+ \adjbox@Gin@add{\@collectbox{\@bgimagebox{#1}{#2}}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{environment}{marginbox*}[1]{Margins as space separated values (like for 'trim')}
+%
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Lapping keys and macros} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{lap}
% \begin{macrocode}
-\expandafter\newcommand\expandafter*\csname marginbox*\endcsname{%
- \@collectboxisenv{marginbox*}%
- \marginbox@s
+\define@key\adjbox@fam{lap}{%
+ \@ifnextchar\bgroup{%
+ \adjbox@lapbox
+ }{%
+ \adjbox@lapbox{#1}{}%
+ }#1{}{}\@nnil
}
% \end{macrocode}
-% \end{environment}
+% \end{key}
%
%
-% \begin{macro}{\marginbox@@}
-% (1) Parse margins (must be done here to allow the user to use the original box dimensions).
-% (2) Change box margins and (3) place the box.
+% \begin{macro}{\adjbox@lapbox}
% \begin{macrocode}
-\def\marginbox@@#1{%
- \adjbox@parse@v{#1}%
- \@marginbox
- \adjbox@tllx
- \adjbox@tlly
- \adjbox@turx
- \adjbox@tury
- \collectedbox
- \usebox\collectedbox
+\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{macro}{\marginbox@@s}
-% (1) Parse margins (must be done here to allow the user to use the original box dimensions).
-% (2) Change box margins and (3) raise the box by the bottom margin to preserve original depth.
+% \begin{key}{adjbox}{rlap}
% \begin{macrocode}
-\def\marginbox@@s#1{%
- \adjbox@parse@v{#1}%
- \@marginbox
- \adjbox@tllx
- \adjbox@tlly
- \adjbox@turx
- \adjbox@tury
- \collectedbox
- \raise\adjbox@tlly\copy\collectedbox
+\define@key\adjbox@fam{rlap}[]{%
+ \adjbox@Gin@Add{\lapbox{\width}}%
}
% \end{macrocode}
-% \end{macro}
+% \end{key}
%
%
-% \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{key}{adjbox}{llap}
% \begin{macrocode}
-\def\@marginbox#1#2#3#4#5{%
- \setbox#5=\hbox{%
- \adjsetlength\@tempdima{#1}%
- \hskip\@tempdima
- \adjsetlength\@tempdima{\dp#5 + #2}%
- \adjsetlength\@tempdimb{\wd#5 + #3}%
- \adjsetlength\@tempdimc{\ht#5 + #4}%
- \dp#5=\@tempdima
- \wd#5=\@tempdimb
- \ht#5=\@tempdimc
- \box#5%
- }%
+\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}
%
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \subsubsection{Minibox and other Environments Keys}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Keys for minibox and varwidth} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{key}{ADJBOX}{minipage}
% \begin{macrocode}
@@ -2967,6 +3028,8 @@
%
% \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{%
\def\adjbox@collectbox##1{\collectbox@{\adjbox@set\begin{#1}#2\adjbox@reset}{##1}{\end{#1}}}%
@@ -2975,6 +3038,7 @@
% \end{macro}
%
% \begin{macro}{\adjbox@set}
+% Sets \Macro\setlength to \pkg{adjcalc} version.
% \begin{macrocode}
\def\adjbox@set{%
\let\adjbox@origsetlength\setlength
@@ -2985,6 +3049,7 @@
%
%
% \begin{macro}{\adjbox@reset}
+% Resets \Macro\setlength to normal version.
% \begin{macrocode}
\def\adjbox@reset{%
\let\setlength\adjbox@origsetlength
@@ -2993,23 +3058,40 @@
% \end{macro}
%
%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Stackbox keys and macros} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
% \begin{macro}{\stackbox}
% \begin{macrocode}
\newcommand*\stackbox[1][c]{%
- \collectboxcheckenv{stackbox}%
- \@testopt{\@stackbox{#1}}{b}%
+ \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]{%
+\def\@@stackbox#1#2[#3]{%
\collectbox@
- {\begin{varwidth}[#2]{\linewidth}\csname adjbox@halign@#1\endcsname}
+ {\begin{varwidth}[#2]{\linewidth}\csname adjbox@halign@#1\endcsname#3}
\BOXCONTENT
{\end{varwidth}}%
}
@@ -3017,10 +3099,27 @@
% \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
+\define@key{ADJBOX}{stack}[{}{}{}]{%
+ \adjbox@stack#1{}{}{}\@nnil
}
% \end{macrocode}
% \end{key}
@@ -3028,14 +3127,14 @@
%
% \begin{macro}{\adjbox@stack}
% \begin{macrocode}
-\def\adjbox@stack#1#2#3\@nnil{%
+\def\adjbox@stack#1#2#3#4\@nnil{%
\ifx\@nnil#1\@nnil
- \adjbox@@stack{c}{b}%
+ \adjbox@@stack{c}{b}{}%
\else
\ifx\@nnil#2\@nnil
- \adjbox@@stack{#1}{b}%
+ \adjbox@@stack{#1}{b}{}%
\else
- \adjbox@@stack{#1}{#2}%
+ \adjbox@@stack{#1}{#2}{#3}%
\fi\fi
}
% \end{macrocode}
@@ -3044,29 +3143,18 @@
%
% \begin{macro}{\adjbox@@stack}
% \begin{macrocode}
-\def\adjbox@@stack#1#2{%
- \def\adjbox@collectbox##1{\collectbox@{\begin{varwidth}[#2]{\linewidth}\csname adjbox@halign@#1\endcsname}{##1}{\end{varwidth}}}%
+\def\adjbox@@stack#1#2#3{%
+ \def\adjbox@collectbox##1{%
+ \collectbox@{%
+ \begin{varwidth}[#2]{\linewidth}%
+ \csname adjbox@halign@#1\endcsname#3%
+ }{##1}{\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}
-% \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}
-%
-%
% Load the \pkg{varwidth} package if available or disable the dependent keys if not.
% \begin{macrocode}
\IfFileExists{varwidth.sty}
@@ -3081,6 +3169,13 @@
% \end{macrocode}
%
%
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{tabular and array keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
% \begin{key}{ADJBOX}{tabular}
% \begin{macrocode}
\define@key{ADJBOX}{tabular}{%
@@ -3144,6 +3239,13 @@
% \end{macro}
%
%
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Keys for inner environments and code} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
% \begin{key}{ADJBOX}{innerenv}
% \begin{macrocode}
\define@key{ADJBOX}{innerenv}{%
@@ -3205,145 +3307,268 @@
%
%
%
-% \begin{key}{ADJBOX}{env}
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Float keys} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{label}
% \begin{macrocode}
-\define@key{ADJBOX}{env}{%
- \@ifnextchar\bgroup{%
- \adjbox@addenv
+\define@key\adjbox@fam{label}{%
+ \def\adjbox@label{\label{#1}}%
+}
+\let\adjbox@label\@empty
+% \end{macrocode}
+% \end{key}
+%
+% \begin{key}{adjbox}{caption}
+% \begin{macrocode}
+\define@key\adjbox@fam{caption}{%
+ \@ifnextchar{[}{%
+ \adjbox@def@caption
}{%
- \adjbox@addenv{#1}\@nnil%
- \remove@to@nnil
+ \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{macro}{\adjust@addenv}
+% \begin{key}{adjbox}{figure}
% \begin{macrocode}
-\def\adjbox@addenv#1#2\@nnil{%
- \def\@tempa{\begin{#1}#2}%
- \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\the\toks@\end{#1}}%
-}%
+\define@key\adjbox@fam{figure}[]{%
+ \Gin@esetsize
+ \@tempswafalse
+ \let\adjustbox@noindent\relax
+ \ifx\@nnil#1\@nnil
+ \expandafter\expandafter\expandafter\adjbox@figure
+ \expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label}{}%
+ \else
+ \expandafter\expandafter\expandafter\adjbox@figure
+ \expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label}{[#1]}%
+ \fi
+}
+\def\adjbox@figure#1#2{%
+ \def\@tempa{\begin{figure}#2}%
+ \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\the\toks@#1\end{figure}}%
+}
% \end{macrocode}
-% \end{macro}
+% \end{key}
%
-% \begin{key}{adjbox}{addcode}
-% Adds code before and after the current boxed content.
-% Syntax:~\Key{addcode}'='{<code before>}{<code afterwards>}
+% \begin{key}{adjbox}{float}
% \begin{macrocode}
-\define@key{adjbox}{Addcode}{%
- \adjust@@addcode#1{}\@nnil%
+\define@key\adjbox@fam{float}{%
+ \let\adjustbox@noindent\relax
+ \@ifnextchar\bgroup{%
+ \adjbox@float
+ }{%
+ \adjbox@float{#1}\@nnil
+ \remove@to@nnil
+ }#1\@nnil
}
-\define@key{adjbox}{addcode}{%
- \Gin@esetsize
- \@tempswatrue
- \adjust@@addcode#1{}\@nnil%
+\def\adjbox@float{%
+ \expandafter\expandafter
+ \expandafter\adjbox@@float\expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label}%
}
-\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
+\def\adjbox@@float#1#2#3\@nnil{%
+ \adjust@addcode{\begin{#2}#3}{#1\end{#2}}%
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{precode}
+% \begin{key}{adjbox}{nofloat}
% \begin{macrocode}
-\define@key{adjbox}{precode}{%
- \Gin@esetsize
- \@tempswatrue
- \adjust@addcode{#1}{}%
+\define@key\adjbox@fam{nofloat}[figure]{%
+ \def\@tempa{\adjust@addcode{\adjnofloat{#1}}}%
+ \expandafter\expandafter\expandafter
+ \@tempa\expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label\endadjnofloat}%
}
% \end{macrocode}
% \end{key}
%
-% \begin{key}{adjbox}{Precode}
-% Same as \Key{precode} but does not set the size yet.
+%
+% \begin{environment}{adjnofloat}
+% Environment used for non-floats.
% \begin{macrocode}
-\define@key{adjbox}{Precode}{%
- \adjust@addcode{#1}{}%
+\newenvironment{adjnofloat}[1]{%
+ \trivlist
+ \def\@captype{#1}%
+ \item\relax
+ \leavevmode
+}{%
+ \endtrivlist
}
% \end{macrocode}
-% \end{key}
+% \end{environment}
%
-% \begin{key}{adjbox}{appcode}
+%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Change or discard the content} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{phantom}
% \begin{macrocode}
-\define@key{adjbox}{appcode}{%
- \toks@\expandafter{\the\toks@#1}%
+\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}{\adjust@addcode}
+% \begin{macro}{\phantombox}[3]{width}{height}{depth}
+% Produces an empty box with the given width, height and depth.
% \begin{macrocode}
-\def\adjust@addcode#1#2{%
- \def\@tempa{#1}%
- \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}#2}%
-}%
+\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}
%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% \subsection{New, experimental macros and keys}
+% \begin{key}{adjbox}{gobble}
+% Discards the content.
+% \begin{macrocode}
+\define@key\adjbox@fam{gobble}[]{%
+ \let\adjustbox@noindent\relax
+ \adjbox@Gin@Add{\@collectbox{}}%
+}
+% \end{macrocode}
+% \end{key}
%
+% \begin{key}{adjbox}{discard}
+% Discards the content.
+% \begin{macrocode}
+\define@key\adjbox@fam{discard}[]{%
+ \let\adjustbox@noindent\relax
+ \adjbox@Gin@Add{\@collectbox{}}%
+}
+% \end{macrocode}
+% \end{key}
%
%
-% \begin{macro}{\bgimagebox}
+% \begin{key}{adjbox}{content}
+% Replaces the content. The old content is still processed completely before being replaced..
% \begin{macrocode}
-\newcommand*\bgimagebox[2][]{%
- \collectboxcheckenv{bgimagebox}%
- \@collectbox{\@bgimagebox{#1}{#2}}%
+\define@key\adjbox@fam{content}{%
+ \adjbox@Gin@Add{\@collectbox{#1}}%
}
% \end{macrocode}
-% \end{macro}
+% \end{key}
%
%
-% \begin{macro}{\@bgimagebox}
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Store box content and sizes} ^^A (((
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{key}{adjbox}{gstore}
+% Store the current content into a box without removing it.
% \begin{macrocode}
-\def\@bgimagebox#1#2{%
- \mbox{%
- \lower\depth\hbox{%
- \edef\@tempa{\noexpand\adjustimage
- {#1,width=\the\width,totalheight=\the\totalheight}%
- {#2}%
- }%
- \@tempa
- }%
- \hskip-\width%
- \BOXCONTENT
- }%
+\define@key\adjbox@fam{gstore}{%
+ \adjbox@Gin@Add{\global\@collectboxto{#1}{\BOXCONTENT}}%
}
% \end{macrocode}
-% \end{macro}
+% \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\@collectboxto{#1}{}}%
+}
+% \end{macrocode}
+% \end{key}
%
-% \begin{key}{adjbox}{bgimage}
-% One or two arguments, the first optional one are further \Macro\includegraphics keys.
+% \begin{key}{adjbox}{gstore width}
% \begin{macrocode}
-\define@key{adjbox}{bgimage}{%
- \@ifnextchar\bgroup{%
- \adjbox@bgimage
- }{%
- \adjbox@bgimage{}{#1}%
- }#1\@nnil
+\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{macro}{\adjbox@bgimage}
+% \begin{key}{adjbox}{gstore height}
% \begin{macrocode}
-\def\adjbox@bgimage#1#2#3\@nnil{%
- \adjbox@Gin@add{\@collectbox{\@bgimagebox{#1}{#2}}}%
+\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}
@@ -3392,11 +3617,11 @@
\ifdim\Gin@nat@height>\totalheight
\Gin@nat@height\totalheight
\fi
- \adjbox@tllx\z@
- \adjbox@tlly\totalheight
- \adjbox@turx\width
- \adjbox@tury\z@
- \advance\adjbox@tlly-\Gin@nat@height
+ \tc@llx\z@
+ \tc@lly\totalheight
+ \tc@urx\width
+ \tc@ury\z@
+ \advance\tc@lly-\Gin@nat@height
\@@splitbox
}
% \end{macrocode}
@@ -3406,20 +3631,20 @@
% \begin{macro}{\@@splitbox}
% \begin{macrocode}
\def\@@splitbox{%
- \advance\adjbox@turx-\@tempdima
+ \advance\tc@urx-\@tempdima
\@@@splitbox
- \ifdim\adjbox@turx>\z@
- \advance\adjbox@tllx+\@tempdima
+ \ifdim\tc@urx>\z@
+ \advance\tc@llx+\@tempdima
\expandafter\@@splitbox
\else
- \ifdim\adjbox@tlly<\splitbox@epsilon
+ \ifdim\tc@lly<\splitbox@epsilon
\splitboxlastnewline
\else
\splitboxnewline
- \adjbox@tllx\z@
- \adjbox@turx\width
- \advance\adjbox@tlly-\Gin@nat@height
- \advance\adjbox@tury+\Gin@nat@height
+ \tc@llx\z@
+ \tc@urx\width
+ \advance\tc@lly-\Gin@nat@height
+ \advance\tc@ury+\Gin@nat@height
\expandafter\expandafter
\expandafter\@@splitbox
\fi
@@ -3434,7 +3659,7 @@
\def\@@@splitbox{%
\begingroup
\setbox\collectedbox=\copy\collectedbox
- \@clipbox\adjbox@tllx\adjbox@tlly\adjbox@turx\adjbox@tury\collectedbox
+ \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury
\splitboxcmd{\usebox\collectedbox}%
\endgroup
}
@@ -3446,7 +3671,7 @@
\def\@@@splitbox{%
\begingroup
\setbox\collectedbox=\copy\collectedbox
- \@clipbox\adjbox@tllx\adjbox@tlly\adjbox@turx\adjbox@tury\collectedbox
+ \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury
\splitboxcmd{\usebox\collectedbox}%
\endgroup
}
@@ -3482,6 +3707,8 @@
% \end{macro}
%
%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
% \begin{macro}{\pagebreakbox}
% \begin{macrocode}
\newcommand\pagebreakbox{%
@@ -3508,8 +3735,8 @@
% \begin{tabular}{ll}
% \Macro\@tempa & Caption code \\
% \Macro\@tempboxa & Caption box \\
-% \Macro\adjbox@tlly & Lower clip amount \\
-% \Macro\adjbox@tury & Lower clip amount \\
+% \Macro\tc@lly & Lower clip amount \\
+% \Macro\tc@ury & Lower clip amount \\
% \end{tabular}
% \begin{macrocode}
\def\@pagebreakbox{%
@@ -3518,32 +3745,32 @@
\storebox\splittedbox{\BOXCONTENT}%
\setbox\collectedbox\hbox{\usestorebox\splittedbox}%
\fi
- \adjsetlength\adjbox@tlly
+ \adjsetlength\tc@lly
{\totalheight-\pagegoal+\pagetotal+\pagebreakboxoffset}%
- \ifdim\adjbox@tlly>\z@
+ \ifdim\tc@lly>\z@
\begingroup
\setbox\collectedbox=\copy\collectedbox
- \@clipbox\z@\adjbox@tlly\z@\z@\collectedbox
+ \@clipbox\collectedbox\z@\tc@lly\z@\z@
\BOXCONTENT
\endgroup
\par\noindent
- \adjsetlength\adjbox@tury{\totalheight-\adjbox@tlly}%
- \ifdim\adjbox@tlly>\textheight
+ \adjsetlength\tc@ury{\totalheight-\tc@lly}%
+ \ifdim\tc@lly>\textheight
\loop
- \advance\adjbox@tlly-\textheight
+ \advance\tc@lly-\textheight
\begingroup
\setbox\collectedbox=\copy\collectedbox
- \@clipbox\z@\adjbox@tlly\z@\adjbox@tury\collectedbox
+ \@clipbox\collectedbox\z@\tc@lly\z@\tc@ury
\BOXCONTENT
\endgroup
- \advance\adjbox@tury\textheight
+ \advance\tc@ury\textheight
\par\noindent
- \ifdim\adjbox@tlly>\textheight
+ \ifdim\tc@lly>\textheight
\repeat
- \@clipbox\z@\z@\z@\adjbox@tury\collectedbox
+ \@clipbox\collectedbox\z@\z@\z@\tc@ury
\BOXCONTENT
\else
- \@clipbox\z@\z@\z@\adjbox@tury\collectedbox
+ \@clipbox\collectedbox\z@\z@\z@\tc@ury
\par\noindent
\BOXCONTENT
\fi
@@ -3562,560 +3789,14 @@
% \end{macrocode}
% \end{macro}
%
-% \iffalse
-%</adjustbox.sty>
-% \fi
-%
-%
-% \iffalse
-%<*adjgrfx.sty>
-% \fi
-% \begin{macrocode}
-\ProvidesPackage{adjgrfx}[2011/07/28 v0.1 Patches to graphicx used by adjustbox]
-\RequirePackage{graphicx}
-% \end{macrocode}
-%
-%
-%%^^A \width, \height, \totalheight, \depth = size current at option execution (changes after every option) (initial: natural size)
-%%^^A \Width, \Height, \Totalheight, \Depth = requested size of image (height/totalheight and width) (initial: natural size)
-%%^^A \WIDTH, \HEIGHT, \TOTALHEIGHT, \DEPTH = natural size of image
-%%
-%%
-%
-% \begin{macro}{\Gin@adj@adddim}
-% \begin{macrocode}
-\newcommand*\Gin@adj@adddim{%
- \let\height\Gin@nat@height
- \let\width\Gin@nat@width
- \let\totalheight\height
- \let\depth\z@
- \let\adjbox@HEIGHT\HEIGHT
- \let\adjbox@WIDTH\WIDTH
- \let\adjbox@TOTALHEIGHT\TOTALHEIGHT
- \let\adjbox@DEPTH\DEPTH
- \global\let\HEIGHT\Gin@nat@height
- \global\let\WIDTH\Gin@nat@width
- \global\let\TOTALHEIGHT\HEIGHT
- \global\let\DEPTH\z@
- \let\adjbox@Height\Height
- \let\adjbox@Width\Width
- \let\adjbox@Totalheight\Totalheight
- \let\adjbox@Depth\Depth
- \global\let\Height\Gin@nat@height
- \global\let\Width\Gin@nat@width
- \global\let\Totalheight\Height
- \global\let\Depth\z@
- \edef\adjbox@restore@dims{%
- \global\adjbox@nat@height\the\adjbox@nat@height\relax
- \global\adjbox@nat@width \the\adjbox@nat@width\relax
- \global\adjbox@req@height\the\adjbox@req@height\relax
- \global\adjbox@req@width \the\adjbox@req@width\relax
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\Gin@adj@remdim}
-% \begin{macrocode}
-\newcommand*\Gin@adj@remdim{%
- \global\let\HEIGHT\adjbox@HEIGHT
- \global\let\WIDTH\adjbox@WIDTH
- \global\let\TOTALHEIGHT\adjbox@TOTALHEIGHT
- \global\let\DEPTH\adjbox@DEPTH
- \global\let\Height\adjbox@Height
- \global\let\Width\adjbox@Width
- \global\let\Totalheight\adjbox@Totalheight
- \global\let\Depth\adjbox@Depth
- \adjbox@restore@dims
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\newdimen\adjbox@nat@width
-\newdimen\adjbox@nat@height
-\newdimen\adjbox@req@width
-\newdimen\adjbox@req@height
-% \end{macrocode}
-%
-% \begin{macro}{\Gin@adj@keepdim}
-% \begin{macrocode}
-\newcommand*\Gin@adj@keepdim{%
- \global\adjbox@nat@height\Gin@nat@height
- \global\adjbox@nat@width \Gin@nat@width
- \global\adjbox@req@height\Gin@req@height
- \global\adjbox@req@width \Gin@req@width
- \global\let\HEIGHT\adjbox@nat@height
- \global\let\WIDTH\adjbox@nat@width
- \global\let\TOTALHEIGHT\adjbox@nat@height
- \global\let\DEPTH\z@
- \global\let\Height\adjbox@req@height
- \global\let\Width\adjbox@req@width
- \global\let\Totalheight\adjbox@req@height
- \global\let\Depth\z@
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\Gin@ii}
-% \begin{macrocode}
-\def\Gin@ii[#1]#2{%
- \def\@tempa{[}\def\@tempb{#2}%
- \ifx\@tempa\@tempb
- \def\@tempa{\Gin@iii[#1][}%
- \expandafter\@tempa
- \else
- \begingroup
- \Gin@adj@adddim
- \@tempswafalse
- \toks@{\Ginclude@graphics{#2}}%
- \setkeys{Gin}{#1}%
- \Gin@esetsize
- \the\toks@
- \Gin@adj@remdim
- \endgroup
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\Gin@iii}
-% \begin{macrocode}
-\def\Gin@iii[#1,#2][#3,#4]#5{%
- \begingroup
- \Gin@adj@adddim
- \Gin@bboxtrue
- \Gin@defaultbp\Gin@llx{#1}%
- \Gin@defaultbp\Gin@lly{#2}%
- \Gin@defaultbp\Gin@urx{#3}%
- \Gin@defaultbp\Gin@ury{#4}%
- \Ginclude@graphics{#5}%
- \Gin@adj@remdim
- \endgroup}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\Gin@setfile}
-% \begin{macrocode}
-\def\Gin@setfile#1#2#3{%
- \ifx\\#2\\\Gread@false\fi
- \ifGin@bbox\else
- \ifGread@
- \csname Gread@%
- \expandafter\ifx\csname Gread@#1\endcsname\relax
- eps%
- \else
- #1%
- \fi
- \endcsname{\Gin@base#2}%
- \else
- \Gin@nosize{#3}%
- \fi
- \fi
- \Gin@viewport@code
- \Gin@nat@height\Gin@ury bp%
- \advance\Gin@nat@height-\Gin@lly bp%
- \Gin@nat@width\Gin@urx bp%
- \advance\Gin@nat@width-\Gin@llx bp%
- \Gin@req@sizes
- \Gin@adj@keepdim
- \expandafter\ifx\csname Ginclude@#1\endcsname\relax
- \Gin@drafttrue
- \expandafter\ifx\csname Gread@#1\endcsname\relax
- \@latex@error{Can not include graphics of type: #1}\@ehc
- \global\expandafter\let\csname Gread@#1\endcsname\@empty
- \fi
- \fi
- \leavevmode
- \ifGin@draft
- \hb@xt@\Gin@req@width{%
- \vrule\hss
- \vbox to \Gin@req@height{%
- \hrule \@width \Gin@req@width
- \vss
- \edef\@tempa{#3}%
- \rlap{ \ttfamily\expandafter\strip@prefix\meaning\@tempa}%
- \vss
- \hrule}%
- \hss\vrule}%
- \else
- \@addtofilelist{#3}%
- \ProvidesFile{#3}[Graphic file (type #1)]%
- \setbox\z@\hbox{\csname Ginclude@#1\endcsname{#3}}%
- \dp\z@\z@
- \ht\z@\Gin@req@height
- \wd\z@\Gin@req@width
- \box\z@
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \iffalse
-%</adjgrfx.sty>
-% \fi
-%
%
+% ^^A )))
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \iffalse
-%<*adjcalc.sty>
-% \fi
-% Test if this package was loaded as package or as file (as part of 'adjustbox'):
-% \begin{macrocode}
-\begingroup
-\def\@tempa{adjcalc}
-\expandafter
-\endgroup
-\ifx\@tempa\@currname
- \ProvidesPackage{adjcalc}[2011/08/07 v1.0 Provides advanced setlength with multiple back-ends (calc, etex, pgfmath)]
- \RequirePackage{xkeyval}
-\fi
-% \end{macrocode}
-%
-%
-%
-% Use e-TeX by default if available, otherwise LaTeX (maybe with \pkg{calc})
-% \begin{macrocode}
-\AtEndOfPackage{\adjcalc@atend}
-\def\adjcalc@atend{%
-\begingroup
-\expandafter\ifx\csname eTeXversion\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}
-%
-% Options:
-% \begin{macrocode}
-\DeclareOptionX<adjbox>{pgfmath}{\adjcalc@pgfmath}
-\DeclareOptionX<adjbox>{etex}{\adjcalc@etex}
-\DeclareOptionX<adjbox>{calc}{\adjcalc@calc}
-\DeclareOptionX<adjbox>{none}{\let\adjcalc@atend\relax\def\adjsetlength{\setlength}\let\adjcalc@overwrite\relax}
-\DeclareOptionX<adjbox>{overwrite}{\adjcalc@overwrite}
-\ProcessOptionsX*<adjbox>
-\disable@keys{adjbox}{none}
-% \end{macrocode}
-%
-% \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\adjbox@default##1##2{%
- \@defaultunits##1=\glueexpr##2 \adjbox@defaultunit\relax\@nnil
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \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\adjbox@default##1##2{%
- \begingroup
- \message{^^J\detokenize{##2}^^J}%
- \def\calc@post@scan####1!{%
- \def\@tempa{####1}%
- \ifx\@tempa\@empty
- \endgroup% to end calc processing
- % is number only
- \global\@adjbox@needsdefaulttrue
- \else
- \endgroup% to end calc processing
- % full expression
- \global\@adjbox@needsdefaultfalse
- \fi
- }%
- \calc@assign@skip{##1}{##2 \adjbox@defaultunit}%
- \endgroup
- \if@adjbox@needsdefault
- ##1=##2 \adjbox@defaultunit\relax
- \else
- \calc@assign@skip{##1}{##2}%
- \fi
- }%
- \def\adjbox@checkdefault##1\@nnil##2##3{%
- \ifx\relax##1\relax\else
- \calc@assign@skip{##2}{##3}%
- \fi
- }%
-}
-\newif\if@adjbox@needsdefault
-% \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\adjbox@default##1##2{%
- \edef\pgfmathresultunitscale{1\adjbox@defaultunit}%
- \let\pgfmathpostparse\pgfmathscaleresult
- \pgfmathparse{##2}%
- ##1=\pgfmathresult pt\relax
- }%
-}
-% \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}
-%
-% \iffalse
-%</adjcalc.sty>
-% \fi
-%
-%
-% \iffalse
-%<*adjpgf.def>
-% \fi
-% \iffalse
-%<!COPYRIGHT>
-% \fi
-% \begin{macrocode}
-\ProvidesFile{adjpgf.def}[%
-%<!DATE>
-%<!VERSION>
-%<*DRIVER>
- 2099/01/01 develop
-%</DRIVER>
- adjustbox fall-back clip 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}
-%
-% \iffalse
-% vim: ft=tex
-% \fi
-% \iffalse
-%</adjpgf.def>
-% \fi
-%
-%
-% \iffalse
-%<*adjpdftex.def>
-% \fi
-% \iffalse
-%<!COPYRIGHT>
-% \fi
-% \begin{macrocode}
-\ProvidesFile{adjpdftex.def}[%
-%<!DATE>
-%<!VERSION>
-%<*DRIVER>
- 2099/01/01 develop
-%</DRIVER>
- adjustbox clip driver for pdftex]
-% \end{macrocode}
-%
-%
-% \begin{macro}{\@cliptoboxdim}
-% Clips to official box dimension.
-%
-% Uses a PDF X-Object which has the side-effect of clipping.
-% TODO: Rewrite to use clipping path?
-% \begin{macrocode}
-\def\@cliptoboxdim#1{%
- \pdfxform#1%
- \setbox#1=\hbox{%
- \pdfrefxform\pdflastxform
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \iffalse
-% vim: ft=tex
-% \fi
-% \iffalse
-%</adjpdftex.def>
-% \fi
-%
-%
-% \iffalse
-%<*adjdvips.def>
-% \fi
-% \iffalse
-%<!COPYRIGHT>
-% \fi
-% \begin{macrocode}
-\ProvidesFile{adjdvips.def}[%
-%<!DATE>
-%<!VERSION>
-%<*DRIVER>
- 2099/01/01 develop
-%</DRIVER>
- adjustbox clip 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{%
- \adjsetlength\@tempdima{\ht#1+\dp#1}%
- \edef\TOTALHEIGHT{-\strip@pt\@tempdima\space}%
- \edef\DEPTH{\strip@pt\dp#1\space}%
- \edef\WIDTH{\strip@pt\wd#1\space}%
- \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
- }%
- \box#1%
- \special{ps: grestore }%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \iffalse
-% vim: ft=tex
-% \fi
-% \iffalse
-%</adjdvips.def>
-% \fi
-%
-%
-% \iffalse
-%<*adjxetex.def>
-% \fi
-% \iffalse
-%<!COPYRIGHT>
-% \fi
-% \begin{macrocode}
-\ProvidesFile{adjpdftex.def}[%
-%<!DATE>
-%<!VERSION>
-%<*DRIVER>
- 2099/01/01 develop
-%</DRIVER>
- adjustbox clip driver for pdftex]
-% \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{%
- \Gin@defaultbp\WIDTH{\wd#1}%
- \Gin@defaultbp\DEPTH{\dp#1}%
- \@tempdima\ht#1%
- \advance\@tempdima\dp#1%
- \Gin@defaultbp\TOTALHEIGHT{\@tempdima}%
- \special{pdf:content q }%
- \special{%
- pdf:literal direct
- 0 -\DEPTH\space \WIDTH\space \TOTALHEIGHT\space re
- }%
- \special{pdf:literal direct W }%
- \special{pdf:literal direct 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 }%
- \box#1%
- \special{pdf:literal direct Q }%
- \special{pdf:literal direct Q }%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \iffalse
-% vim: ft=tex
-% \fi
-% \iffalse
-%</adjxetex.def>
+%</adjustbox.sty>
% \fi
%
+% ^^A )))
% \Finale
% \endinput
+% ^^A vim: foldenable foldmethod=marker foldmarker=(((,)))
diff --git a/Master/texmf-dist/source/latex/adjustbox/adjustbox.ins b/Master/texmf-dist/source/latex/adjustbox/adjustbox.ins
index cd9098becc6..196015c47cf 100644
--- a/Master/texmf-dist/source/latex/adjustbox/adjustbox.ins
+++ b/Master/texmf-dist/source/latex/adjustbox/adjustbox.ins
@@ -3,12 +3,21 @@
\askforoverwritefalse
\generate{%
\file{adjustbox.sty}{\nopreamble\from{adjustbox.dtx}{adjustbox.sty}}%
- \file{adjcalc.sty}{\nopreamble\from{adjustbox.dtx}{adjcalc.sty}}%
- \file{adjgrfx.sty}{\nopreamble\from{adjustbox.dtx}{adjgrfx.sty}}%
- \file{adjpgf.def}{\nopreamble\from{adjustbox.dtx}{adjpgf.def}}%
- \file{adjpdftex.def}{\nopreamble\from{adjustbox.dtx}{adjpdftex.def}}%
- \file{adjdvips.def}{\nopreamble\from{adjustbox.dtx}{adjdvips.def}}%
- \file{adjxetex.def}{\nopreamble\from{adjustbox.dtx}{adjxetex.def}}%
+ \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/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx b/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx
new file mode 100644
index 00000000000..cb1afd4dd95
--- /dev/null
+++ b/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx
@@ -0,0 +1,1944 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011-2012 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>
+ 2012/05/16
+%<=/DATE>
+%<=*VERSION>
+ v1.0
+%<=/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{484}
+%
+% \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.}
+%
+% \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}\PassOptionsToPackage{pgf}{graphicx}}
+\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{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}[2012/05/13 v1.0 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}
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-pgf.def>
+% \fi
+%
+% \subsubsection{pdftex driver}
+% \iffalse
+%<*tc-pdftex.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-pdftex.def}[2012/05/13 v1.0 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{%
+ \Gin@defaultbp\WIDTH{\wd#1}%
+ \Gin@defaultbp\DEPTH{\dp#1}%
+ \@tempdima\ht#1%
+ \advance\@tempdima\dp#1%
+ \Gin@defaultbp\TOTALHEIGHT{\@tempdima}%
+ \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}
+%
+%^^A vim: ft=tex
+% \iffalse
+%</tc-pdftex.def>
+% \fi
+%
+% \subsubsection{dvips driver}
+% \iffalse
+%<*tc-dvips.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-dvips.def}[2012/05/13 v1.0 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{%
+ \adjsetlength\@tempdima{\ht#1+\dp#1}%
+ \edef\TOTALHEIGHT{-\strip@pt\@tempdima\space}%
+ \edef\DEPTH{\strip@pt\dp#1\space}%
+ \edef\WIDTH{\strip@pt\wd#1\space}%
+ \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
+ }%
+ \box#1%
+ \special{ps: grestore }%
+ }%
+}
+% \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}[2012/05/13 v1.0 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{%
+ \Gin@defaultbp\WIDTH{\wd#1}%
+ \Gin@defaultbp\DEPTH{\dp#1}%
+ \@tempdima\ht#1%
+ \advance\@tempdima\dp#1%
+ \Gin@defaultbp\TOTALHEIGHT{\@tempdima}%
+ \special{pdf:bcontent }%
+ \special{%
+ pdf:literal direct
+ 0 -\DEPTH\space \WIDTH\space \TOTALHEIGHT\space re
+ }%
+ \special{pdf:literal direct W }%
+ \special{pdf:literal direct n }%
+ \box#1%
+ \special{pdf:econtent }%
+ }%
+}
+% \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
+%