diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/adjustbox |
Initial commit
Diffstat (limited to 'macros/latex/contrib/adjustbox')
-rw-r--r-- | macros/latex/contrib/adjustbox/README | 26 | ||||
-rw-r--r-- | macros/latex/contrib/adjustbox/adjcalc.dtx | 426 | ||||
-rw-r--r-- | macros/latex/contrib/adjustbox/adjcalc.pdf | bin | 0 -> 152773 bytes | |||
-rw-r--r-- | macros/latex/contrib/adjustbox/adjustbox.dtx | 6203 | ||||
-rw-r--r-- | macros/latex/contrib/adjustbox/adjustbox.ins | 23 | ||||
-rw-r--r-- | macros/latex/contrib/adjustbox/adjustbox.pdf | bin | 0 -> 380505 bytes | |||
-rw-r--r-- | macros/latex/contrib/adjustbox/trimclip.dtx | 2351 | ||||
-rw-r--r-- | macros/latex/contrib/adjustbox/trimclip.pdf | bin | 0 -> 213356 bytes |
8 files changed, 9029 insertions, 0 deletions
diff --git a/macros/latex/contrib/adjustbox/README b/macros/latex/contrib/adjustbox/README new file mode 100644 index 0000000000..fb560d38ef --- /dev/null +++ b/macros/latex/contrib/adjustbox/README @@ -0,0 +1,26 @@ +LaTeX bundle adjustbox +======================== +Copyright (c) 2011-2019 by Martin Scharrer <martin@scharrer-online.de> +WWW: <https://bitbucket.org/martin_scharrer/adjustbox> (incl. bug tracker) + +This bundle contains the the adjustbox package and its auxiliary packages trimclip and adjcalc. +The initial purpose of adjustbox was to supplement the standard graphics/x package, +which defines the macros \resizebox, \scalebox and \rotatebox, with the macros \trimbox and \clipbox. +An additional \marginbox macro is also provided. +These macros are now placed in the dedicated package trimclip which is loaded by adjustbox. +The package comes with clipping driver files are provided for pdftex (incl. LuaLaTeX), dvips and xetex. A +fall-back driver which uses the pgf package is still included. +The driver files got written by Joseph Wright (LaTeX3 project) and the package author. + +The main feature of adjustbox is the general \adjustbox macro which extends the key=value +interface of \includegraphics from the graphicx package, and applies it to general text +content. It also provides further text/box modifications keys, macros and envionments. + +Both adjustbox and trimclip use the adjcalc package to allow for algebraic expressions for all length +arguments. The adjcalc package can use either e-TeX, the calc package or the pgfmath package. + +All macros use the authors other package collectbox to read the content as box and not as +macro argument. This allows for all forms of content including special material like verbatim content. +A special feature of collectbox is used to provide matching environments with the identical names as the +macros. + diff --git a/macros/latex/contrib/adjustbox/adjcalc.dtx b/macros/latex/contrib/adjustbox/adjcalc.dtx new file mode 100644 index 0000000000..318bda128f --- /dev/null +++ b/macros/latex/contrib/adjustbox/adjcalc.dtx @@ -0,0 +1,426 @@ +% \iffalse meta-comment +%<=*COPYRIGHT> +%% Copyright (C) 2011-2018 by Martin Scharrer <martin@scharrer-online.de> +%% ---------------------------------------------------------------------- +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Martin Scharrer. +%% +%% This work consists of the files adjcalc.dtx, adjustbox.ins +%% and the derived file adjcalc.sty. +%% It is part of the larger adjustbox bundle. +%% +%<=/COPYRIGHT> +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{adjcalc.dtx}[% +%<=*DATE> + 2012/05/16 +%<=/DATE> +%<=*VERSION> + v1.1 +%<=/VERSION> + DTX file for the adjcalc package] +\documentclass[a4paper]{ydoc}[2011/11/16] +\usepackage{amsmath} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{fourier} +\usepackage{newverbs} +\MakeSpecialShortVerb\qverb\" +%\AtBeginDocument{\MakeShortMacroArgs\`\relax} +%\AtEndDocument{\DeleteShortVerb\`} +\GetFileInfo{adjcalc.dtx} +\usepackage{adjcalc}[\filedate] +\usepackage{tikz} +\normalmarginpar + + +%\EnableCrossrefs +%\CodelineIndex +%\RecordChanges +\OnlyDescription +\begin{document} + \DocInput{\jobname.dtx} + \PrintChanges + %\newpage\PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{274} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2011/11/16}{First version after extraction from \pkg{adjustbox} package.} +% \changes{v1.1}{2012/05/16}{Better separation from the \pkg{adjustbox} package. Added own manual.} +% +% \GetFileInfo{adjcalc.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let} +% \bundle{adjustbox} +% \author{Martin Scharrer} +% \email{martin@scharrer-online.de} +% \ydocpdfsettings +% \maketitle +% +% \begin{abstract} +% This package provides macros to assign or to add algebraic expressions to \LaTeX lengths and counters. +% It either uses $\epsilon$-\TeX, the \pkg{calc} package or the \pkg{pgfmath} package internally to achieve this. +% This package is part of the \pkg{adjustbox} bundle and was originally part of the \pkg{adjustbox} package before +% it was extracted to a dedicated package. +% \end{abstract} +% +% \section{Introduction} +% \LaTeX\ lengths and counters can be set using \Macro\setlength and \Macro\setcounter, +% and values can be added to these using \Macro\addtoclength and \Macro\addtocounter, respectively. +% By default these macros await a single length or integer value to be assigned or added. +% However, often it is beneficial to use a short algebraic expression, like a sum of two values, instead. +% The \pkg{calc} package was created for this and redefines the above macros to parse the given expression. +% Another possibility is to use $\epsilon$-\TeX's \Macro\dimexpr or \Macro\glueexpr which also allows for +% several algebraic operations and is more efficient than the higher-level \pkg{calc} package. +% Finally PGF/TikZ provides a large math engine with the \pkg{pgfmath} package. It allows even +% for complicated functions like $\log$ or $\sin$. However, \pkg{pgfmath} is rather large, especially because +% with PGF v2.10 it cannot be loaded on its own due to a bug, which forces the whole \pkg{pgf} package to be loaded. +% +% Package authors which like to write macros which allow algebraic expressions for its length arguments +% now face the dilemma which math interface they should use. Either they exclude users which do not have an +% $\epsilon$-TeX distribution (even if they are very rare) or require to load a large package. +% This was the case with the \pkg{adjustbox} package and therefore own wrapper macros were used instead which +% will use one of the different math engine mentioned above. +% Because this functionality was deemed useful for other packages of the same and other authors it was +% extracted into the dedicated package \pkg{adjcalc}. The idea is that the user can choose the used math engine +% using package options. +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Package Options}\label{sec:options} ^^A ((( +% The following options define the way length values are processed by the provided macros. +% The first group can be either used as package options and as local setting using \Macro\adjcalcset or as keys +% for \Macro\adjustbox or the \env{adjustbox} environment (but not for \Macro\includegraphics even if the \opt{export} +% option of \pkg{adjustbox} was used). +% The only difference between using them as package options or keys is that as package option they also load required packages. +% Therefore all keys used in the document should be used as package options first or the required packages must be loaded +% manually. +% +% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]} +% \oitem{etex} Uses the $\epsilon$-\TeX\ primitive \Macro\glueexpr to parse length values. This allows for additions, +% subtractions as well as multiplications and devision by a numeric factor. See the official \pkg{etex\_man} document +% for more details. This setting is the default if $\epsilon$-\TeX\ is detected (which should be the case with all +% modern \LaTeX\ distributions). +% \oitem{calc} Uses the \pkg{calc} package to parse length values. It supports all operations mentioned for \opt{etex} and +% also some other operation like \Macro\widthof{<text>}. +% See the \pkg{calc} package manual for more details. +% This is the default setting if $\epsilon$-TeX is not detected. +% \oitem{pgfmath} Uses the \pkg{pgfmath} package of the \pkg{pgf} bundle to parse length values. It supports all basic +% numeric operations and also advanced mathematical functions. +% See the \pkg{pgf} manual for more details. +% Because the \pkg{pgfmath} package can't be loaded +% independently in the current version (v2.10) the whole \pkg{pgf} package will be loaded. +% \oitem{overwrite} This option will overwrite the standard macros with the macros of this package. +% This e.g.\ sets \Macro\setlength to be identical to \Macro\adjsetlength. +% Any package option used after \opt{overwrite} will still take affect before the redefinition, +% i.e.\ the order in which \opt{overwrite} is used is not meaningful. +% \oitem{defaultunit}\MacroArgs!{\hspace*{-1ex}}!'='<unit>\relax +% This sets the default unit used for macros and keys which allow for unit-less values, +% e.g.\ the \Key{trim} key of \Macro\adjustbox or the \Macro\trimbox macro of the \pkg{trimclip} package. +% The standard default unit is the same as for \Macro\includegraphics: "bp" (big points, PostScript points). +% However, for \LaTeX\ material \TeX\ normal unit "pt" (\TeX\ points) are better suited and will avoid rounding +% errors which otherwise get introduced by the internal conversion. +% The default unit is only used if the particular value is only a single number without unit, +% but not if any mathematical operations are used. +% If the special value |none| is used no default unit is applied and the internal check if the value is a single number +% is by-passed. This gives a small speed bonus and can be used to avoid potential issues with complex values. +% At this moment this setting will disable the default unit feature for the rest of the current group (i.e.\ all +% further \Macro\adjustbox keys or globally if used as a package option) and further usages of this option will +% have no affect. This might change in future versions of this package. +% \end{description} +% +% \noindent +% The following option can only be used as package option: +% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]} +% \oitem{none} Disables the features of this package and makes all macros use the normal \LaTeX\ equivalents, +% e.g.\ \Macro\adjsetlength will expand to \Macro\setlength, etc. +% This option also disables any previous set option as well as any future use of \opt{overwrite}. +% \end{description} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \section{Macros} +% +% \DescribeMacro\adjcalcset{<key=value, \ldots>} +% This configuration macro allows to change the above mentioned options during the document. +% Any changes are only locally to the current group/environment. +% Please see the descriptions of the options for any limitations. +% +% +% \DescribeMacro\adjsetlength{<\textbackslash lengthmacro>}{<length expression>} +% \DescribeMacro\adjaddtolength{<\textbackslash lengthmacro>}{<length expression>} +% \DescribeMacro\adjsetcounter{<counter name>}{<integer expression>} +% \DescribeMacro\adjaddtocounter{<counter name>}{<integer expression>} +% These macros can be used to set and add to \LaTeX\ length registers and counters like with the normal +% macros \Macro\setlength, \Macro\addtolength, \Macro\setcounter and \Macro\addtocounter. +% However, these macros allow the use of algebraic expressions, like sums and multiplications, while +% the standard macros only await a single value. +% +% +% \DescribeMacro\adjsetlengthdefault{<\textbackslash lengthmacro>}{<length expression with or without unit>} +% This macro set the length macro but does also support length values without an explicit unit. +% If no unit is used the default unit set by the \opt{defaultunit} option is used. The initial default unit +% is `|bp|' (big points, i.e.\ PostScript/PDF points, 72bp=1inch). +% +% +% \StopEventually{} +% \clearpage +% \section{Implementation} +% +% \iffalse +%<*adjcalc.sty> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesPackage{adjcalc}[% +%<!DATE> +%<!VERSION> +%<*DRIVER> + 2099/01/01 develop +%</DRIVER> + Provides advanced setlength with multiple back-ends (calc, etex, pgfmath)] +% \end{macrocode} +% +% +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +% +% +% Use e-TeX by default if available, otherwise the \pkg{calc} package. +% \begin{macrocode} +\def\adjcalc@atend{% +\begingroup +\expandafter\ifx\csname glueexpr\endcsname\relax + \endgroup + \RequirePackage{calc}% + \adjcalc@calc + \def\adjcalc@etex{\PackageError{adjcalc}{e-TeX not available for current compiler!}}% +\else + \endgroup + \adjcalc@etex +\fi +} +% \end{macrocode} +% +% Initial definitions for the package options. This macros are later redefined because the same keys +% can be used as macro options. +% \begin{macrocode} +\def\adjcalc@pgfmath{\AtEndOfPackage{\RequirePackage{pgf}}\def\adjcalc@atend{\adjcalc@pgfmath}} +\def\adjcalc@etex{\def\adjcalc@atend{\adjcalc@etex}} +\def\adjcalc@calc{\AtEndOfPackage{\RequirePackage{calc}}\def\adjcalc@atend{\adjcalc@calc}} +\def\adjcalc@overwrite{\AtEndOfPackage{\adjcalc@overwrite}} +% \end{macrocode} +% +% The initial default unit is `|bp|' like for \pkg{graphicx}. +% \begin{macrocode} +\def\adjcalc@defaultunit{bp}% +% \end{macrocode} +% +% +% Options: +% \begin{macrocode} +\DeclareOptionX<adjcalc>{pgfmath}{\adjcalc@pgfmath} +\DeclareOptionX<adjcalc>{etex}{\adjcalc@etex} +\DeclareOptionX<adjcalc>{calc}{\adjcalc@calc} +\DeclareOptionX<adjcalc>{none}{% + \let\adjcalc@atend\relax + \let\adjcalc@overwrite\relax + \def\adjsetlength{\setlength}% + \def\adjaddtolength{\addtolength}% + \def\adjsetcounter{\setcounter}% + \def\adjaddtocounter{\addtocounter}% +} +\DeclareOptionX<adjcalc>{overwrite}{\adjcalc@overwrite} +\DeclareOptionX<adjcalc>{defaultunit}[bp]{% + \begingroup + \def\@tempa{#1}% + \def\@tempb{none}% + \ifx\@tempa\@tempb% 'none': + \endgroup + \def\adjsetlengthdefault{\adjsetlength}% + \else + \ifx\@tempb\adjcalc@defaultunit + \endgroup + % was 'none' before + \let\adjsetlengthdefault\adjsetlengthdefault@ + \else + \endgroup + \fi + \fi + \def\adjcalc@defaultunit{#1}% +} +\ProcessOptionsX*<adjcalc> +\disable@keys{adjcalc}{none} +% \end{macrocode} +% +% +% \begin{macro}{\adjcalcset} +% User level settings macro. +% \begin{macrocode} +\def\adjcalcset{% + \setkeys{adjcalc}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjcalc@etex} +% \begin{macrocode} +\def\adjcalc@etex{% + \protected\def\adjsetlength##1##2{% + ##1=\glueexpr(##2)\relax + }% + \protected\def\adjaddtolength##1##2{% + \advance##1 by \glueexpr(##2)\relax + }% + \protected\def\adjsetcounter##1##2{% + \@ifundefined{c@##1}% + {\@nocounterr{##1}}% + {\global\csname c@##1\endcsname\numexpr(##2)\relax}% + }% + \protected\def\adjaddtocounter##1##2{% + \@ifundefined{c@##1}% + {\@nocounterr{##1}}% + {\global\advance\csname c@##1\endcsname\numexpr(##2)\relax}% + }% + \def\adjsetlengthdefault@##1##2{% + \@defaultunits##1=\glueexpr##2 \adjcalc@defaultunit\relax\@nnil + }% + \let\adjsetlengthdefault\adjsetlengthdefault@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\newif\if@adjcalc@needsdefault +% \end{macrocode} +% +% +% \begin{macro}{\adjcalc@calc} +% This uses the underlying (re-)definitions of the normal macros (\Macro\setlength, ...) done by the \pkg{calc} package. +% This allows to locally redefine \Macro\setlength to call \Macro\adjsetlength, etc., without causing an infinite loop. +% \begin{macrocode} +\def\adjcalc@calc{% + \DeclareRobustCommand\adjsetlength{\calc@assign@skip}% + \DeclareRobustCommand\adjaddtolength[1]{\calc@assign@skip{\advance ##1}}% + \DeclareRobustCommand\adjsetcounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\csname c@##1\endcsname}{##2}}}% + \DeclareRobustCommand\adjaddtocounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\advance\csname c@##1\endcsname}{##2}}}% + \def\adjsetlengthdefault@##1##2{% + \begingroup + \def\calc@post@scan####1!{% + \def\@tempa{####1}% + \ifx\@tempa\@empty + \endgroup% to end calc processing + % is number only + \global\@adjcalc@needsdefaulttrue + \else + \endgroup% to end calc processing + % full expression + \global\@adjcalc@needsdefaultfalse + \fi + }% + \calc@assign@skip{##1}{##2 \adjcalc@defaultunit}% + \endgroup + \if@adjcalc@needsdefault + ##1=##2 \adjcalc@defaultunit\relax + \else + \calc@assign@skip{##1}{##2}% + \fi + }% + \def\adjcalc@checkdefault##1\@nnil##2##3{% + \ifx\relax##1\relax\else + \calc@assign@skip{##2}{##3}% + \fi + }% + \let\adjsetlengthdefault\adjsetlengthdefault@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjcalc@pgfmath} +% \begin{macrocode} +\def\adjcalc@pgfmath{% + \DeclareRobustCommand\adjsetlength{\pgfmathsetlength}% + \DeclareRobustCommand\adjaddtolength{\pgfmathaddtolength}% + \DeclareRobustCommand\adjsetcounter{\pgfmathsetcounter}% + \DeclareRobustCommand\adjaddtocounter{\pgfmathaddtocounter}% + \def\adjsetlengthdefault@##1##2{% + \edef\pgfmathresultunitscale{1\adjcalc@defaultunit}% + \let\pgfmathpostparse\pgfmathscaleresult + \pgfmathparse{##2}% + ##1=\pgfmathresult pt\relax + }% + \let\adjsetlengthdefault\adjsetlengthdefault@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@settobp} +% \begin{macrocode} +\def\adjcalc@settobp#1#2{% + \begingroup + \adjsetlength\@tempdima{#2}% + \@tempdima=0.99626\@tempdima + \edef\@tempa{\endgroup\def\noexpand#1{\strip@pt\@tempdima\space}}% + \@tempa +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjcalc@overwrite} +% \begin{macrocode} +\def\adjcalc@overwrite{% + \let\setlength\adjsetlength + \let\addtolength\adjaddtolength + \let\setcounter\adjsetcounter + \let\addtocounter\adjaddtocounter +} +% \end{macrocode} +% \end{macro} +% +% Execute at-end code. +% \begin{macrocode} +\adjcalc@atend +% \end{macrocode} +% \iffalse +%</adjcalc.sty> +% \fi +% +% \Finale +% \endinput diff --git a/macros/latex/contrib/adjustbox/adjcalc.pdf b/macros/latex/contrib/adjustbox/adjcalc.pdf Binary files differnew file mode 100644 index 0000000000..f8bb78c491 --- /dev/null +++ b/macros/latex/contrib/adjustbox/adjcalc.pdf diff --git a/macros/latex/contrib/adjustbox/adjustbox.dtx b/macros/latex/contrib/adjustbox/adjustbox.dtx new file mode 100644 index 0000000000..ebcfeb7176 --- /dev/null +++ b/macros/latex/contrib/adjustbox/adjustbox.dtx @@ -0,0 +1,6203 @@ +% \iffalse meta-comment +%<=*COPYRIGHT> +%% Copyright (C) 2011-2019 by Martin Scharrer <martin@scharrer-online.de> +%% ---------------------------------------------------------------------- +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Martin Scharrer. +%% +%% This work consists of the files adjustbox.dtx, adjustbox.ins +%% and the derived file adjustbox.sty. +%% +%<=/COPYRIGHT> +% \fi +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ^^A DRIVER ((( +% \iffalse +%<*driver> +\ProvidesFile{adjustbox.dtx}[% +%<=*DATE> + 2019/01/04 +%<=/DATE> +%<=*VERSION> + v1.2 +%<=/VERSION> + DTX file for the adjustbox package] +\documentclass[a4paper]{ydoc}[2011/08/11] +\usepackage{amsmath} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{fourier} +\usepackage{newverbs} +\usepackage{xparse} +\MakeSpecialShortVerb\qverb\" +%\AtBeginDocument{\MakeShortMacroArgs\`\relax} +%\AtEndDocument{\DeleteShortVerb\`} +\GetFileInfo{adjustbox.dtx} +\usepackage{adjustbox}[\filedate] +\usepackage{tikz} + +\renewenvironment{example}[1][Example:]{% + \subsubsection*{#1}% +}{% + \par +} +\newenvironment{examples}[1][Examples:]{% + \subsubsection*{#1}% +}{% + \par +} +\global\optionaloff +\let\optionalon\relax + +\lstdefinelanguage{none}{}% +\lstdefinelanguage{adjustbox}{% + moretexcs={% + begin,end,adjustbox + }, + emph={% + frame,fbox,cframe,cfbox,minipage,raise + }, +}% + +\lstdefinestyle{examplecode}{% + basicstyle=\ttfamily\small, + numbers=none,language=none, + classoffset=1, + morekeywords={begin,end}, + keywordstyle=\bfseries, + classoffset=0, + morekeywords={adjustbox,minsizebox,maxsizebox,lapbox,marginbox,phantombox}, + keywordstyle=\macrodescstyle, + emph={viewport, trim, Trim, Viewport, Clip, Clip*, frame, fbox, cframe, cfbox, reflect, lap, margin, margin*, dpi, + pxdim, execute, raise, valign, bgcolor, set, height, depth, vsize, width, totalheight, center, left, right, outer, inner, min, max, + size, totalsize, + minipage, varwidth, innerenv, innercode, env, Addcode, addcode, precode, Precode, appcode, angle, scale, height, width, totalheight, resolution, + }, + emphstyle=\keydescstyle, +} + +\makeatletter +\def\PrintExample{% + \begingroup + \par\smallskip\noindent + \leavevmode + \BoxExample + \@tempdima=\textwidth + \advance\@tempdima by -\wd\examplecodebox\relax + \advance\@tempdima by -\wd\exampleresultbox\relax + \advance\@tempdima by -15pt\relax + \ifdim\@tempdima>\bigskipamount + \hbox to \textwidth{% + \null\hss + \minipage[c]{\wd\examplecodebox}\usebox\examplecodebox\endminipage + \hfill\hskip\bigskipamount\hfill + \minipage[c]{\wd\exampleresultbox}% + \EXAMPLERESULT + \endminipage + \hss\null + }% + \else + \vbox{% + \leftline{\usebox\examplecodebox}% + \vspace{\bigskipamount}% + \rightline{\EXAMPLERESULT}% + }% + \fi + \par\smallskip + \endgroup +} +\def\EXAMPLERESULT{% + \leavevmode\hbox{% + \textcolor{exampleborder}{% + \boxframe + {\dimexpr\wd\exampleresultbox+2\fboxrule\relax}% + {\dimexpr\ht\exampleresultbox+\fboxrule\relax}% + {\dimexpr\dp\exampleresultbox+\fboxrule\relax}% + \hskip-\wd\exampleresultbox + \hskip-\fboxrule + }% + \usebox\exampleresultbox + }% +}% +\makeatother +\colorlet{exampleborder}{black!33} +\def\Descsep{\par\vskip-2.5ex\relax} + +%\EnableCrossrefs +%\CodelineIndex +%\RecordChanges +\OnlyDescription +\renewcommand{\bottomfraction}{0.5} +\begin{document} + \DocInput{adjustbox.dtx} + \PrintChanges + %\newpage\PrintIndex +\end{document} +%</driver> +% \fi +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ^^A Title page ((( +% \CheckSum{3447} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v0.1}{2011/01/24}{First internal version} +% \changes{v0.2}{2011/01/27}{First released version} +% \changes{v0.3}{2011/03/20}{Bug fix for wrong baseline placed on the bottom} +% \changes{v0.4}{2011/07/xx}{Added pdftex driver} +% \changes{v0.5}{2011/08/13}{Added more macros and keys} +% \changes{v0.5a}{2011/08/21}{Fixed \Key{left} and \Key{right} keys. Fixed \Key{valign}'='t} +% \changes{v0.6}{2011/09/04}{Added tabular support.} +% \changes{v0.6a}{2011/10/29}{Fixed issue with keys affecting the content in an unwanted way.} +% \changes{v0.7}{2011/10/30}{Added \cs{adjustboxset} and \cs{adjustimage} macros.} +% \changes{v0.8}{2011/11/14}{ +% Added driver files for dvips and xelatex. Moved pdftex driver code to own file. +% Fixed and improved default unit code for the \opt{calc} option. +% Changed \cs{adjustimage} code to use internals of \cs{includegraphics}. This allows the redefinition of \cs{includegraphics}. +% Added manual for \Key{bgcolor} and added \Key{bgcolor*}. +% Changed \Key{bgimage} to use \cs{adjustimage}. +% Added manual entries for \Key{cfbox} and \Key{cframe}. +% Removed loading of non-mandatory \pkg{storebox} package for now. +% Added \Key{set vsize}. +% Added shortcuts \Key{rlap} and \Key{llap}. +% Added \adjincludegraphics and the Export option. +% Fix for \Key{innerenv} argument. +% Added lengths \cs{Width}, \cs{Height}, \cs{Depth} and \cs{Totalheight} for the original dimensions of the content. +% Added own \cs{raisebox} variant to support math expressions even for \cs{includegraphics}. +% Some code cleanup. +% Added \Key{varwidth} key as an alternative to \Key{minipage}. +% Added \stackbox and \Key{stack} key and \env{stackbox} environment (similar to \cs{shortstack}) +% Added check for \pkg{xcolor} package. +% } +% \changes{v0.9}{2012/05/16}{ +% Basic trim and clip macros and driver files are now placed in a dedicated minimal package 'trimclip'. +% Special thanks goes to Joseph Wright (LaTeX3 project) for his work on the driver files. +% Clipping drivers are provided for 'pdftex' (incl. LuaTeX), 'dvips' and 'xetex' as well as a PGF fall-back +% driver. +% Packages: New dedicated 'trimclip' package with own manual. +% Better separation between 'adjcalc' and 'adjustbox' package. +% Review of manuals +% New adjustbox keys: +% * content +% * gstore +% * gstore* +% * gstore width/height/depth/totalheight/sizes +% * gobble/discard +% * phantom +% * warn width +% * float +% * nofloat +% * figure +% * label +% * caption +% * vspace +% * vspace* +% * padding (alias of 'margin') +% * padding* (alias of 'margin*') +% Fixes: env key now works correctly; Fixed raise box code. +% Macro changes: Added third optional argument to \stackbox. +% } +% \changes{v1.0}{2012/05/21}{%^^A +% * Updated manual to contain all new keys and macro. +% * Code optimisations. +% * Improvements of (re-)boxing code. +% * Added user-level macros to define keys. +% * Changed horizontal alignment keys to box the content and added matching macros. +% * Changed horizontal inner/outer side keys to use 'ifodd' package and added matching macros. +% * Added missing \cs{leavevmode} for "raise" key. +% * Simplified code for "valign" key. Fixed spurious space for "valign=v". +% * Fixed min/max size keys to double a single value correctly. +% * Code cleanup with "warn width" key. +% } +% \changes{v1.1}{2018/04/08}{%^^A +% * Several bug fixes. +% * Support for round corners and frames. +% } +% \changes{v1.2}{2019/01/04}{%^^A +% * Added missing 'clip' feature for rounded frames. +% * Changed order of corner values for rounded frames. This includes an update to the clipping drivers. +% * Corrected 'adjnofloat' environment used by the 'nofloat' key to support the 'hypcap' feature of the 'caption' and 'hypcap' packages. +% * Updated manual description of `export` option as requested by Issue #9. +% * Updated manual to use (left, bottom, right, top) for the side values instead of (llx, lly, urx, ury). +% * Some other improvements in the manual. +% * Added keys and matching commands and environments to align to the page margins and text area borders: +% 'pagecenter', 'pageleft', 'pageright', 'pageinner', 'pageouter', +% 'textareacenter', 'textarealeft', 'textarearight', 'textareainner', 'textareaouter'. +% * Added 'noindent' key. +% * Added \newadjustimage and \NewAdjustImage commands to define custom versions of \adjustimage with predefined key +% lists. This include variation to renew, provide and declare such macros. +% * Added \provideadjustboxenv and \declareadjustboxenv. +% * Added \provideadjustboxcmd and \declareadjustboxcmd. +% } +% +% \GetFileInfo{adjustbox.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let} +% +% \author{Martin Scharrer} +% \email{martin@scharrer-online.de} +% \repository{https://bitbucket.org/martin_scharrer/adjustbox} +% \ydocpdfsettings +% \maketitle +% +% \makeatletter +% \def\LATeX{\texorpdfstring{(L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts +% \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em)\TeX}{(La)TeX}} +% \makeatother +% +% \begin{abstract} +% This package allows to adjust general \LATeX\ material in several ways using a key=value interface. +% It got inspired by the interface of \Macro\includegraphics from the \pkg{graphicx} package. +% This package also loads the \pkg{trimclip} package which code was once included in this package. +% \end{abstract} +% \clearpage% \tableofcontents +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Introduction} ^^A ((( +% The standard \LaTeX{} package \pkg{graphicx} (the extended version of \pkg{graphics}) provides the macro +% \Macro\includegraphics[<options>]{<file name>} which can be used to include graphic files. Several options can be used +% to scale, resize, rotate, trim and/or clip the graphic. +% The macros \Macro\scalebox, \Macro\resizebox and \Macro\rotatebox are also provided to apply the corresponding +% operation on \LATeX{} material, which is subsequently placed inside a \Macro\hbox. +% However no macros are provided to trim or clip \LATeX{} material, most likely because this operations +% are not done by \TeX{} but by the output format, i.e.\ using PostScript (PS) or PDF operations. +% +% This package started by providing the missing macros \Macro\clipbox and \Macro\trimbox. +% Then a general \Macro\adjustbox macro which allows to combine many operations using a key=value syntax was added and +% further extended until it represented the main feature of this package. Newly added keys are also provided as +% dedicated macros and corresponding environments. +% The \Macro\clipbox and \Macro\trimbox macros were then moved together with the required output driver code to a +% dedicated package \pkg{trimclip}. This allows documents and other packages to use these basic features without +% loading the full \pkg{adjustbox} package. +% +% +% ^^A )))2 +% \subsection{Dependencies} ^^A (((2 +% The \pkg{adjustbox} package and its \pkg{trimclip} sub-package require the author's other packages \pkg{adjcalc} +% (bundled with \pkg{adjustbox}) and \pkg{collectbox}, as well as the packages \pkg{xkeyval}, \pkg{graphicx} and \pkg{ifpdf}. +% The \pkg{varwidth} package is automatically loaded if installed, otherwise the \Key{varwidth} and \Key{stack} keys are +% disables as well as \Macro\stackbox and the \env{stackbox} environment. +% The \pkg{ifoddpage} package is automatically loaded if installed, otherwise the \Key{outer} and \Key{inner} keys are +% disables as well as \Macro\outersidebox and \Macro\innersidebox macros and corresponding environments. +% For features which use colors the \pkg{xcolor} package must also be loaded manually (the \pkg{color} package is fine, too). +% The experimental |split| and |pagebreak| features also require the \pkg{storebox} package to be loaded manually. +% +% ^^A )))2 +% \subsection{Verbatim Support}\label{sec:verbatim} ^^A (((2 +% The macros provided by \pkg{adjustbox} and \pkg{trimclip} read the content as a horizontal \TeX{} box and not as an +% macro argument in order to support verbatim content. +% This means that the braces around the content can also be written as \Macro\bgroup and \Macro\egroup: +% \begin{macroquote} +% \adjustbox{key=value,\ldots}\AlsoMacro\bgroup~<content>\AlsoMacro\egroup +% \end{macroquote} +% Special care is taken to allow the \meta{content} to be a single macro (except \Macro\bgroup) without any braces: +% \begin{macroquote} +% \adjustbox{key=value,\ldots}\AlsoMacro\somemacro +% \end{macroquote} +% This is to support the habit of some \LaTeX{} users to drop the braces for single token arguments. +% All environments support verbatim content. +% Note that the plain\TeX{} syntax for environments (\Macro\adjustbox\ldots\Macro\endadjustbox) can not be used +% because it will trigger \Macro\adjustbox as a macro. However, the braces around the content can be replaced +% by \Macro\bgroup and \Macro\egroup. +% +% ^^A )))2 +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Package Options}\label{sec:options} ^^A ((( +% This package accepts the following options: +% +% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]} +% \oitem{export} Exports the keys of \Macro\adjustbox to \Macro\includegraphics so that they can be used with this +% macro as well. Note that not all keys will works properly with \Macro\includegraphics as its internal +% code does not support all features. If problems occur the option |Export| should be used. +% For new documents it is recommended to use the macro \Macro\adjustimage{<keys>}{<filename>} instead. +% \oitem{Export} Sets \Macro\includegraphics to be identical to \Macro\adjincludegraphics, which also allows the usage +% of all \Macro\adjustbox keys. +% \oitem{pgf} This option is passed to \pkg{trimclip} and makes it to use the \pkg{pgf} package for all clip operations. +% This overrides all automatically detected drivers. +% \oitem{PGF} This option will pass the \opt{pgf} to \pkg{trimclip} and enable the \opt{pgfmath} option of +% \pkg{adjcalc}, i.e.\ the \pkg{pgf} +% package is used for clip operations and the \pkg{pgfmath} pacakge is used to parse length arguments. +% \oitem{minimal} Only load a minimal set of code, i.e.\ \pkg{trimclip} and \Macro\adjustbox/\env{adjustbox} +% but no additional keys and macros. +% \end{description} +% +% \noindent +% The following options define the way length values are processed by the provided macros. +% They are passed to the \Macro\adjcalcset macro of the \pkg{adjcalc} package and load any required packages. +% These options can also be used as local keys on \Macro\adjustbox. See the \pkg{adjcalc} manual for more details on +% them. +% +% \begin{description}\def\oitem#1{\item[{\normalfont\opt{#1}}]} +% \oitem{etex} Uses the $\epsilon$-\TeX\ primitive \Macro\glueexpr to parse length values. +% \oitem{calc} Uses the \pkg{calc} package to parse length values. +% \oitem{pgfmath} Uses the \pkg{pgfmath} package of the \pkg{pgf} bundle to parse length values. +% \oitem{defaultunit}\MacroArgs!{\hspace*{-1ex}}!'='<unit>\relax +% This sets the default unit used for values which accept length without units, e.g.\ \Key{trim}. +% \end{description} +% +% \noindent +% In addition, all driver options of the \pkg{trimclip} package are also accepted and passed to it. +% All unknown options are passed to the \pkg{graphicx} package, which might pass them down to the \pkg{graphics} +% package. +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Main Macros}^^A ((( +% The following macros and environments represent the main functionality of this package. +% Special care is taken so that the macros and the environments can have the same name. +% For starred environments the star can be either part of the name or an optional argument. +% +% \subsection{Adjust Box Content} ^^A (((2 +% \vskip-\lastskip +% \DescribeMacro\adjustbox{<key=value, \ldots>}{<content>} +% The \Macro\adjustbox macro allows the modification of general \LATeX\ content using a key=value syntax. +% This can be seen as an extension of the \Macro\includegraphics macro from images to any \LATeX{} material. +% The macro supports the all \Macro\includegraphics keys and many more. +% However, they are provided as a mandatory not as an optional argument, because an \Macro\adjustbox without options +% would not make sense and can be replaced by a simple \Macro\mbox. +% As already stated the content is read as a box, not as a macro argument, therefore verbatim or other special +% content is supported and the braces can also be replaced by \Macro\bgroup and \Macro\egroup. +% There is no starred version of this macro. +% +% \DescribeEnv[<content>]{adjustbox}{<key=value, \ldots>} +% The environment version of \Macro\adjustbox. A difference to the macro is that it includes \Macro\noindent +% to suppress paragraph indention. +% +% \Needspace*{5\baselineskip} +% \clearpage\subsection{Adjust Images} +% \vskip-\lastskip +% \DescribeMacro\adjustimage{<key=value, \ldots>}{<image filename>} +% This macro can be used as an extension of \Macro\includegraphics. +% While \Macro\adjustbox is based on the same interface as \Macro\includegraphics it provides more keys and allows +% global keys set by \Macro\adjustboxset. Most keys can be exported to \Macro\includegraphics using the \opt{export} +% option, but there is no support for global keys\footnote{However some keys, but not all, can be set globally using +% \Macro\setkeys{Gin}{<includegraphic key=value pairs>}}. Therefore it can make sense to use +% \Macro\adjustbox{<key/value pairs>}{\AlsoMacro\includegraphics{<filename>}}, which is the definition of +% \Macro\adjustimage. +% However, it does not use \Macro\includegraphics directly, but an internal macro, to allow the redefinition of +% \Macro\includegraphics. +% This macro does not require the \opt{export} option and therefore helps to avoid option clashes +% if \pkg{adjustbox} is loaded at several places. +% +% +% \DescribeMacro\adjincludegraphics[<key/value pairs>]{<image filename>} +% Like \Macro\adjustimage but in the same format as \Macro\includegraphics, i.e.\ with an optional argument. This macro +% allows to use all features of \Macro\adjustbox on images, however special care must be taken if the values include +% `|[ ]|'. In this case either the whole value or the while optional argument must be wrapped in `|{ }|': +% \Macro\adjincludegraphics['key='{[..]},...]{..} or \\\Macro\adjincludegraphics[{key=[..],...}]{..}. \\ +% It is possible to redefine \Macro\includegraphics to \Macro\adjincludegraphics and this is done by +% the \opt{Export} option (not to be confused with the \opt{export} option). +% +% ^^A )))2 +% \clearpage\subsection{Defining custom environments and macros} ^^A (((2 +% After \pkg{adjustbox} is used to define custom environments to format specific content. +% If an environment contains other environments these are often written in the plain form \Macro\foo \ldots +% \Macro\endfoo to avoid the overhead of \Macro\begin and \Macro\end and to keep the outer environment name for +% meaningful error messages. As mentioned, the dual nature of \Macro\adjustbox which will detect if it is used +% as environment of macro does not permit this plain form, which can be a pitfall for custom environment definitions. +% Instead the macro form \Macro\adjustbox{<key=value>}\AlsoMacro\bgroup \ldots \Macro\egroup should be used. +% To simplify custom environment definitions based on \Macro\adjustbox/\env{adjustbox} the following macros are +% provided. +% +% +% \DescribeMacro\newadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>} +% This declaration defines an environment and macro with the given name which will apply the given \pkg{adjustbox} keys +% to its content. The environment/macro can also posses arguments, including one leading optional argument, which can be +% used inside the key=value pairs. It is recommended to wrap the arguments into braces, e.g.\ use `|{#1}|' instead of +% `|#1|' etc., to avoid issues with potentially included commas and equal signs. +% The number and type of arguments are defined using two optional arguments in the same +% way as for \Macro\newcommand and \Macro\newenvironment. +% +% +% \DescribeMacro\newadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>} +% This declaration works similar to the unstarred version but only defines an environment. +% This environment can therefore be used like any other normal \LaTeX\ environment, including in its plain +% form {\macrodescstyle\textbackslash\meta{name}} \ldots {\macrodescstyle{\textbackslash end\meta{name}}}. +% +% +% \DescribeMacro\renewadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>} +% \DescribeMacro\renewadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will redefine an existing macro/environment and cause an +% error if it was not yet defined. +% +% +% \DescribeMacro\provideadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>} +% \DescribeMacro\provideadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will define a macro/environment only if it does not exists +% yet. +% +% +% \DescribeMacro\declareadjustboxenv{<name>}[<num>][<default>]{<key=value,\ldots>} +% \DescribeMacro\declareadjustboxenv*{<name>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxenv and \Macro\newadjustboxenv* but will always define a macro/environment even if it does already exist. +% +% +% \DescribeMacro\newadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% This declaration defines a macro which applies the given \pkg{adjustbox} keys to its content. +% As with \Macro\adjustbox the content is read as box, not as macro argument. +% The macro arguments (if any) are defined in the same way as with \Macro\newcommand. +% The arguments can then be used inside the key=value pairs. The number of arguments does not +% include the content. +% This declaration is intended if no environment form is required and is more efficient than the dual declaration. +% +% \begin{example} +% \begin{examplecode} +% \newadjustboxcmd{\frotate}[1]{rotate={#1},fbox}% +% \frotate{30}{Text} +% \end{examplecode} +% \end{example} +% +% \DescribeMacro\renewadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxcmd but will redefine an existing macro and cause an +% error if it was not yet defined. +% +% +% \DescribeMacro\provideadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxcmd but will define the macro only if it does not exist yet. +% +% +% \DescribeMacro\declareadjustboxcmd{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustboxcmd but will define the macro in any case even if it does exist yet.% +% +% +% \DescribeMacro\newadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% \DescribeMacro\renewadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% \DescribeMacro\provideadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% These macros allow to define new versions of \Macro\adjustimage with predefined key lists. +% The new define image macros can also have arguments which can be used in the predefined key list to +% substitude values or one or multiple keys. +% +% They work like \Macro\newcommand, \Macro\renewcommand and \Macro\providecommand, respectively, where +% \meta{num} is the number of arguments and \meta{default} provides a default value for the then optional +% first argument. However, instead of a macro content a \meta{key=value} list must be present, which can +% contain the arguments (|#1|, |#2|, etc). If arguments are used as values they should be wrapped in braces. +% If there are only part of a value the whole value should be wrapped in braces. This is to avoid causes commas +% inside the arguments to cause issues with the key=value list. +% +% \begin{example} +% \begin{examplecode} +% \newadjustimage{\myimage}[2][red]{width={#2},cfbox={#1}}% +% \myimage{2cm}{example-image} +% \myimage[blue]{2cm}{example-image} +% \end{examplecode} +% \end{example} +% +% \DescribeMacro\declareadjustimage{<\textbackslash macro>}[<num>][<default>]{<key=value,\ldots>} +% Like \Macro\newadjustimage but will not cause an error if the macro is already defined. +% +% +% \DescribeMacro\NewAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>} +% \DescribeMacro\RenewAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>} +% \DescribeMacro\ProvideAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>} +% \DescribeMacro\DeclareAdjustImage{<\textbackslash macro>}{<xparse argument specification>}{<key=value,\ldots>} +% These macros also allow to define new versions of \Macro\adjustimage with predefined key lists, but use +% the \pkg{xparse} package (which must be loaded separately!) and its macros \Macro\NewDocumentCommand, \Macro\RenewDocumentCommand, +% \Macro\ProvideDocumentCommand and \Macro\DeclareDocumentCommand instead of the standard \LaTeX\ macro creation +% macros. This allows a larger variety of optional and mandatory arguments. Please see the \pkg{xparse} manual +% for more details. +% +% \begin{example} +% \begin{examplecode} +% \NewAdjustImage{\myimage}{O{red}m}{width={#2},cfbox={#1}}% +% \myimage{2cm}{example-image} +% \myimage[blue]{2cm}{example-image} +% \end{examplecode} +% \end{example} +% +% +% ^^A )))2 +% \clearpage\subsection{Setting keys globally} ^^A (((2 +% \vskip-\lastskip +% \DescribeMacro\adjustboxset{<global keys to be executed \emph{before} local keys>} +% \DescribeMacro\adjustboxset*{<global keys to be executed \emph{after} local keys>} +% Using these two macros all keys can be set globally, i.e.\ for all future \Macro\adjustbox macros and \env{adjustbox} +% environments. Note that these settings are actually \emph{local} to the current \TeX\ group and only really global if +% used in the preamble or outside any group. The normal macro will place all given keys before the keys used in first +% argument of \Macro\adjustbox\ / \env{adjustbox}, while the starred version will place them afterwards. +% +% If these macros are used several times there keys are accumulated. This happens in the given order for the normal +% version and in reversed order for the starred version, i.e.\ the keys of further \Macro\adjustboxset or +% \Macro\adjustboxset* are always added so they face inwards. If used without any keys but an empty argument, all keys +% previously set with the same macro are removed (from the current \TeX\ scope). This means \Macro\adjustboxset{} +% clears all keys set be previously usages of \Macro\adjustboxset{<keys>} and \Macro\adjustboxset*{} clears all set by +% \Macro\adjustboxset*{<keys>}. Such resets are again local to the current \TeX\ group. +% +% +% \begin{examples} +% The macros: +% \begin{macroquote} +% \adjustboxset{keya=1} \\ +% \adjustboxset*{keyc=3}\\ +% \adjustbox{keyb=2}{content} +% \end{macroquote} +% are effectively the same as: +% \begin{macroquote} +% \adjustbox{keya=1,keyb=2,keyc=3}{content} +% \end{macroquote} +% \par\medskip\noindent +% The macros: +% \begin{macroquote} +% \adjustboxset{keya=1,keyb=2} \\ +% \adjustboxset{keyc=3,keyd=4} \\ +% \adjustboxset*{keyg=7,keyh=8}\\ +% \adjustboxset*{keyi=9,keyj=10}\\ +% \adjustbox{keye=5,keyf=6}{content} +% \end{macroquote} +% are effectively the same as: +% \begin{codequote} +% \AlsoMacro\adjustbox'{keya=1,keyb=2,keyc=3,keyd=4,keye=5,keyf=6,'\\ +% !\hskip0pt!' keyi=9,keyj=10,keyg=7,keyh=8}'{content} +% \end{codequote} +% \end{examples} +% +% ^^A )))2 +% \clearpage\subsection{Argument Values}\label{sec:argval} ^^A (((2 +% All length values given in the arguments of all macros and keys provided by this package are parsed +% by and advanced version of \Macro\setlength\relax (called \Macro\adjsetlength) which uses either $\epsilon$-\TeX\ +% expressions (default), the \pkg{calc} package (default fall-back) or the \Macro\pgfmathparse of the \pkg{pgf} package. +% This allows for arithmetic expressions in these arguments. See the package options in \autoref{sec:options} to learn +% how to change the used length parser. Note that early versions of this package used \Macro\pgfmathparse by default. +% Older documents therefore might need now use the \opt{pgfmath} option to compile correctly. +% +% Note that the four values for \Macro\trimbox and \Macro\clipbox as well as for the +% \Key{trim} and \Key{viewport} option of \Macro\adjustbox are separated by spaces. If the expression of any of this +% values holds a space or ends with a macro (eats trailing spaces!) it must be wrapped into braces "{ }". +% +% +% \DescribeMacros +% \hbox{\Macro\width~~~\Macro\height~~~\Macro\depth~~~\Macro\totalheight}% +% \endDescribeMacros +% These \LaTeX{} lengths hold the current dimensions of the content and can be used as part all length arguments. When +% the size of the content is changed by a key these lengths will be adjusted to hold the new size for all further keys. +% The totalheight is the height plus depth. With the \pkg{patch} option these lengths can also be used for +% \Macro\includegraphics. +% +% \DescribeMacros +% \hbox{\Macro\Width~~~\Macro\Height~~~\Macro\Depth~~~\Macro\Totalheight}% +% \endDescribeMacros +% These \LaTeX{} lengths hold the original dimension of original unchanged content and are not modified. They are +% useful if the size of the content is modified by several keys, but further keys should still work relative to the +% original content. +% +% +% \DescribeMacro\smallestside +% This macro expands to either \Macro\width or \Macro\totalheight whatever is smaller. +% +% \DescribeMacro\largestside +% This macro expands to either \Macro\width or \Macro\totalheight whatever is larger. +% +% \DescribeMacro\Smallestside +% This macro expands to either \Macro\Width or \Macro\Totalheight whatever is smaller. +% +% \DescribeMacro\Largestside +% This macro expands to either \Macro\Width or \Macro\Totalheight whatever is larger. +% +% +% \subsubsection*{Default unit} +% If no unit is provided for of the bounding box coordinates (left, bottom, right, top) in the trim and clip features then +% PostScript points (\emph{big points}, bp, $72\,\text{bp}=1\,\text{inch}$) are used, as it is the default behaviour of +% the \Key{trim} and \Key{viewport} options of \pkg{graphicx}'s \Macro\includegraphics. Note that \pkg{graphicx} +% converts all values, independent if a unit is provided or not, internally to bp, because graphics where traditionally +% stored in Encapsulated PostScript (EPS) files. The more modern PDF files also use bp instead of pt. Because the +% \pkg{adjustbox} package macros target \LATeX{} material and users will mostly use pt values this internal conversion +% to bp got disabled for them to avoid unnecessary rounding errors. Since v0.5 the default unit can be changed using the +% |defaultunit|\MacroArgs'='<unit>\relax key (which is also usable as global package option). +% +% ^^A )))2 +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Adjustbox Keys} ^^A ((( +% This packages provides the following \Macro\adjustbox keys with matching macros and environments. +% +% +% \subsection{Trimming and Clipping} ^^A (((2 +% The following keys allow content to be trimmed (i.e.\ the official size is made smaller, so the remaining material +% laps over the official boundaries) or clipped (overlapping material is not displayed). +% These keys come in different variants, where the lower-case keys represent the behavior of +% the corresponding \Macro\includegraphics keys. The corresponding macros (\Macro\trimbox, \Macro\clipbox, etc.) +% and environments (\env{trimbox}, \env{clipbox}, etc.) are included in the +% accompanying \pkg{trimclip} package and are explained in its manual. +% +% \DescribeKey{trim}'='<all sites> +% \DescribeKey{trim}'='<left/right>~<top/bottom> +% \DescribeKey{trim}'='<left>~<bottom>~<right>~<top> +% This key represents the original \Key{trim} key of \Macro\includegraphics but accepts its value in different forms. +% Unlike most other keys it always acts on the original content independent in which order it is used with other keys. +% If only one value is given it will be used for all four sites. +% If only two values are given, seperated by a space, the first one will be used for the left and right side and the second for the +% bottom and top side. +% +% +% \DescribeKey{viewport}'='<left>~<bottom>~<right>~<top> +% This key represents the original \Key{viewport} key of \Macro\includegraphics. +% It always trims the original content to the given view port independent from its position. +% +% \DescribeKey{clip} +% \DescribeKey{clip}'=true|false' +% This boolean key represents the original \Key{clip} key of \Macro\includegraphics. +% It is intended to be used to make \Key{trim} or \Key{viewport} clip the trimmed material. +% Note that the material will still be part of the output file but is simply not shown. +% It might be exported from the output file using special tools, so using it to censor classified information is a +% bad idea. +% +% +% \DescribeKey{Trim}'='<all sites> +% \DescribeKey{Trim}'='<left/right>~<top/bottom> +% \DescribeKey{Trim}'='<left>~<bottom>~<right>~<top> +% \DescribeKey{Viewport}'='<left>~<bottom>~<right>~<top> +% The normal \Key{trim} and \Key{viewport} keys are applied on the original content before any resizing or (most) other +% keys take effect. This is because for \Macro\includegraphics the trimming is done by the internal graphic driver, +% while the effects can be applied later (but can also be driver dependent). +% If the \Key{trim} and \Key{viewport} keys are used multiple times only the last values will be used for the trimming, +% i.e. the content is only trimmed once. The upper case variants \Key{Trim} and \Key{Viewport} will wrap the content +% internally in a \Macro\trimbox or \Macro\trimbox*\relax macro which can be applied multiple times, e.g.\ before and +% after the content is rotated. These two keys awaits the same format as the original keys. However, the \Key{clip} key +% has no effect on them. +% +% +% \DescribeKey{Clip}'='<all sites> +% \DescribeKey{Clip}'='<left/right>~<top/bottom> +% \DescribeKey{Clip}'='<left>~<bottom>~<right>~<top> +% \DescribeKey{Clip*}'='<left>~<bottom>~<right>~<top> +% The \Key{Clip} key will clip the given amounts from the current content and can be used several times if required. +% The starred version will use the given coordinates as \Key{viewport}. +% These keys work by wrapping the content internally in a \Macro\clipbox or \Macro\clipbox*\relax macro. +% +% +% \DescribeKey{rndcorners}'='<radius for all four corners> +% \DescribeKey{rndcorners}'='<left corners>~<right corners> +% \DescribeKey{rndcorners}'='<upper left>~<upper right>~<lower left>~<lower right> +% This key produces round corners by clipping the content. This is done using the same way as the +% above clipping keys but instead of a rectangle clipping path one with quarter circles is used. +% The radius of the every round corner can be given separately if wanted. If only one value is given +% it is used for all four corners. If only two values are given they will be used for the left and right side, respectively. +% A value of 0pt will produce a normal rectangular corner. +% No radius should be larger than half the smallest side (minimum of \Macro\width and \Macro\totalheight). +% +% Please see also the related keys \Key{rndfbox} and \Key{rndframe}, which allow to add a rounded frame around the content as well. +% +% +% ^^A )))2 +% \clearpage\subsection{Margins and Vertical Spacing} ^^A (((2 +% \vspace{-\baselineskip} +% +% \DescribeKey{margin}'='<all sites> +% \DescribeKey{margin}'='<left/right>~<top/bottom> +% \DescribeKey{margin}'='<left>~<bottom>~<right>~<top> +% This key can be used to add a margin (white space) around the content. It can be seen as the opposite of \Key{Trim}. +% The original baseline of the content is preserved because \meta{bottom} is added to the depth. +% It is also available under the alternative name \Key{padding}, which can be used to more visually distinguish an inner +% margin from an outer margin e.g.\ if a frame is added. +% +% \begin{example} +% \begin{examplecode} +% Before \adjustbox{padding=1ex 2ex 3ex 4ex,frame,margin=1ex 2ex 3ex 4ex}{Text} After +% \end{examplecode} +% \end{example} +% +% \DescribeKey{margin*}'='<all sites> +% \DescribeKey{margin*}'='<left/right>~<top/bottom> +% \DescribeKey{margin*}'='<left>~<bottom>~<right>~<top> +% This starred version is almost identical to the normal \Key{margin} key, but also raises the content by the \MacroArgs<bottom> +% amount, so that the original depth is preserved instead of the original baseline. +% Note that while \Key{margin} is basically the opposite of \Key{Trim}, \Key{margin*} is not the opposite of \Key{Trim*}. +% Instead it also takes the same values as the unstarred key and not viewport values like \Key{Trim*}. +% An alternative name of \Key{margin*} is \Key{padding*}. +% +% \begin{example} +% \begin{examplecode} +% Before \adjustbox{padding*=1ex 2ex 3ex 4ex,frame,margin*=1ex 2ex 3ex 4ex}{Text} After +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{vspace}'='<above/below> +% \DescribeKey{vspace}'='<above>~<below> +% The \Key{vspace} key adds a vertical space before and after the content. +% This is done by adding paragraph breaks and \Macro\vspace macros, which will yield better spacing between +% paragraphs then when using the \Key{margin} key. +% However \Key{vspace} forces vertical mode around the content. Adding further keys after \Key{vspace} will force +% restricted horizontal mode again and the vertical space will be ignored. For this situation the \Key{margin} key is +% better suited. +% +% \DescribeKey{vspace*}'='<above/below> +% \DescribeKey{vspace*}'='<above>~<below> +% Identical to \Key{vspace} but uses \Macro\vspace'*' instead. +% The difference is that the vertical space is not ignored at page breaks, but its full amount is always forced. +% +% +% ^^A )))2 +% \clearpage\subsection{Minimum and Maximum Size} ^^A (((2 +% The following keys allow to set a minimum or maximum size. +% The content will be scaled down or up if required. +% +% +% \DescribeKey{min width}'='<width> +% \DescribeKey{max width}'='<width> +% \DescribeKey{min height}'='<height> +% \DescribeKey{max height}'='<height> +% \DescribeKey{min totalheight}'='<total height> +% \DescribeKey{max totalheight}'='<total height> +% These keys allow to set the minimum and maximum width, height or totalheight of the content. +% The current size of the content is measured and the content is resized if the constraint is not already met, +% otherwise the content is unchanged. Multiple usages of these keys are checked one after each other, and therefore +% it is possible that a later one is undoing the size changes of an earlier one. +% A good example is \Key{max width}'='\AlsoMacro\textwidth which will limit large content to the text width but will not affect smaller +% content. +% +% \DescribeKey{min size}'='{<width>}{<height>} +% \DescribeKey{max size}'='{<width>}{<height>} +% \DescribeKey{min totalsize}'='{<width>}{<total height>} +% \DescribeKey{max totalsize}'='{<width>}{<total height>} +% These keys allow to specify the minimum or maximum width and (total)height of the content together, +% which is more efficient than using the width and (total)height keys described earlier. +% +% +% +% \DescribeMacro\minsizebox{<width>}{<height>}{<content>} +% \DescribeMacro\minsizebox'*'{<width>}{<totalheight>}{<content>} +% This macro is like \Macro\resizebox of the \pkg{graphics/x} package, but only resizes the content if its natural size is smaller +% than the given \meta{width} or \meta{height}. +% If only one value should be set the other one can be replaced by "!". +% If required the content is scaled up so that the width and height is equal or larger than the given values, but does not change +% the aspect ratio. +% The star variant uses the total height instead of only the height. +% This macro is used internally for the \Key{min width}, \Key{min height}, \Key{min totalheight} and \Key{min totalsize} keys. +% +% \begin{examples} +% \begin{examplecode} +% \minsizebox{3cm}{2ex}{Some Text} which will be enlarged +% \end{examplecode} +% \begin{examplecode} +% \minsizebox{!}{4ex}{\fbox{Some Text}} which will be enlarged +% \end{examplecode} +% \begin{examplecode} +% \minsizebox*{!}{4ex}{\fbox{Some Text}} which will be enlarged +% \end{examplecode} +% \begin{examplecode} +% \minsizebox{3cm}{!}{Some Text} which will be enlarged +% \end{examplecode} +% \begin{examplecode} +% \minsizebox{1cm}{1ex}{Some Text}, already large enough +% \end{examplecode} +% \end{examples} +% +% +% \DescribeMacro\maxsizebox{<width>}{<height>}{<content>} +% \DescribeMacro\maxsizebox'*'{<width>}{<totalheight>}{<content>} +% This macro is like \Macro\resizebox of the \pkg{graphics/x} package, but only resizes the content if its natural size is larger +% than the given \meta{width} or \meta{height}. +% If only one value should be set the other one can be replaced by "!". +% If required the content is scaled down so that the width and height is equal or smaller than the given values, but does not change +% the aspect ratio. +% The star variant uses the total height instead of only the height. +% This macro is used internally for the \Key{max width}, \Key{max height}, \Key{max totalheight} and \Key{max totalsize} keys. +% +% \begin{examples} +% \begin{examplecode} +% \maxsizebox{1cm}{1ex}{Some Text} which will be reduced +% \end{examplecode} +% \begin{examplecode} +% \maxsizebox{!}{1ex}{\fbox{Some Text}} which will be reduced +% \end{examplecode} +% \begin{examplecode} +% \maxsizebox*{!}{1ex}{\fbox{Some Text}} which will be reduced +% \end{examplecode} +% \begin{examplecode} +% \maxsizebox{1cm}{!}{Some Text} which will be reduced +% \end{examplecode} +% \begin{examplecode} +% \maxsizebox{3cm}{1cm}{Some Text}, already small enough +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{warn width} +% \DescribeKey{warn width}=<max width> +% If this key is used the current width of the content is measured and compared with the given maximum width (default is +% \Macro\linewidth). +% If the content is wider than this value by more than the \TeX\ length \Macro\hfuzz\relax (by default 0.1pt) +% an \emph{Overfull hbox} warning is produced. +% The warning will include the source code position and the information that it was an |adjustbox| not a normal +% paragraph: +% \par\smallskip\par +% {\ttfamily Overfull |\hbox| (X.Ypt too wide) in adjustbox at line N} +% +% {\ttfamily Overfull |\hbox| (X.Ypt too wide) in adjustbox at lines N-M} +% \par\smallskip\par\noindent +% Note that this key is not able to take any horizontal space before the |adjustbox| +% into account. This includes a paragraph indention which might be present with \Macro\adjustbox. +% +% This key is useful to be used before the horizontal alignment keys which change the official width of the content +% and prevent the normal \emph{Overfull} warnings to take affect. +% +% +% ^^A )))2 +% \Needspace*{8\baselineskip} +% \clearpage\subsection{Scaling} ^^A (((2 +% \vspace{-\baselineskip} +% +% \DescribeKey{scale}'='<factor> +% \DescribeKey{scale}'='{<h-factor>}{<v-factor>} +% The normal \Key{scale} key of \pkg{graphicx} only allows for one scale factor which is used for both the horizontal and vertical scaling. +% With \pkg{adjustbox} it is also possible to provide the horizontal and vertical scale factors separately. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{scale=2}{Some text!} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{scale={2}{1}}{Some text!} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{reflect} +% This key reflects the content by using \Macro\reflectbox internally, which is identical to \Macro\scalebox{-1}[1], +% i.e.\ this key is identical to \Key{scale}'='{-1}{1}. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{reflect}{Some text!} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeMacro\scalebox{<h-factor>}[<v-factor>]{<content>} +% \DescribeMacro\reflectbox{<content>} +% These macros is provided by the loaded \pkg{graphicx} package and only mentioned here for the sake of completeness. +% See the |grfguide| for more details. +% +% +% ^^A )))2 +% \clearpage\subsection{Frame} ^^A (((2 +% The following keys can be used to draw frames around the content. +% +% \DescribeKey{fbox} +% \DescribeKey{fbox}'='<rule width> +% \DescribeKey{fbox}'='<rule width>~<sep> +% \DescribeKey{fbox}'='<rule width>~<sep>~<margin> +% Draws a framed box around the content like \Macro\fbox would do. +% Using the optional space separated values the rule width, the separation (inner padding) and the outer margin can be set. +% If not they default to the values \Macro\fbox uses by default: \Macro\fboxrule, \Macro\fboxsep and zero margin. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{fbox}{Like \cs{fbox}} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{fbox=1pt}{With 1pt rule width} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{fbox=1pt 2pt}{With 1pt rule width and 2pt separation} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{fbox={\fboxrule} 1pt}{With normal rule width and 1pt separation} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{fbox=1pt 1pt 1pt}{With 1pt for rule width, separation and outer margin} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{frame} +% \DescribeKey{frame}'='<rule width> +% \DescribeKey{frame}'='<rule width>~<sep> +% \DescribeKey{frame}'='<rule width>~<sep>~<margin> +% The \Key{frame} key has the same effect as the \Key{fbox} key but is modeled after \LaTeX's \Macro\frame macro (not the version \cls{beamer} defines). +% This means it adds a tight frame with zero separation around the content by default. Besides that it accepts the same space separated values. +% This key is useful to easily add a tight frame around images where the normal separation wouldn't fit. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{frame}{Tight box} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{cfbox}'='<color> +% \DescribeKey{cfbox}'='<color>~<rule width> +% \DescribeKey{cfbox}'='<color>~<rule width>~<sep> +% \DescribeKey{cfbox}'='<color>~<rule width>~<sep>~<margin> +% Identical to \Key{fbox} but uses the given color for the frame. +% The \pkg{xcolor} package must be loaded manually in order for this key to work. +% \begin{example} +% \begin{examplecode} +% \adjustbox{cfbox=blue 1pt}{Like a blue \cs{fbox} with \cs{fboxrule}=1pt} +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{cframe}'='<color> +% \DescribeKey{cframe}'='<color>~<rule width> +% \DescribeKey{cframe}'='<color>~<rule width>~<sep> +% \DescribeKey{cframe}'='<color>~<rule width>~<sep>~<margin> +% Identical to \Key{frame} but uses the given color for the frame. +% The \pkg{xcolor} package must be loaded manually in order for this key to work. +% \begin{example} +% \begin{examplecode} +% \adjustbox{cframe=blue!50!green} +% {Like a blue and green \cs{frame}} +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{rndframe}'='<radius for all four corners> +% \DescribeKey{rndframe}'='<left corners>~<right corners> +% \DescribeKey{rndframe}'='<upper left>~<upper right>~<lower left>~<lower right> +% \DescribeKey{rndframe}'='{<options>}{<radius for all four corners>} +% \DescribeKey{rndframe}'='{<options>}{<left corners>~<right corners>} +% \DescribeKey{rndframe}'='{<options>}{<upper left>~<upper right>~<lower left>~<lower right>} +% +% \begingroup +% \colorlet{keydesc}{keydesc!50!green} +% \DescribeKey{color}'='{<color>} +% \DescribeKey{color*}'='{<color command>} +% \DescribeKey{width}'='{<rule width>} +% \DescribeKey{sep}'='{<rule separation>} +% +% \DescribeKey{clip} +% \DescribeKey{clip}'=true|false' +% \endgroup +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{scale=3,bgcolor=gray,rndframe={color=red,width=2\fboxrule,sep=2\fboxsep}{15pt}} +% {\Huge XXXX}% +% \end{examplecode} +% \end{example} +% +% \DescribeKey{rndcornersbox} +% Like \Key{rndframe} (see argument list there) but only clips the corners without drawing a frame. +% +% \DescribeKey{rndfbox} +% Like \Key{rndframe} (see argument list there) but with preset +% \begingroup +% \colorlet{keydesc}{keydesc!50!green} +% \Key{sep}'='0pt. +% \endgroup +% +% \DescribeMacro\rndcornersbox +% \DescribeMacro\rndframebox +% \DescribeMacro\rndfbox +% Standalone macro versions of the corresponding keys. See there for the list of arguments. +% +% ^^A )))2 +% \clearpage\subsection{Vertical Alignment} ^^A (((2 +% The following keys can be used to adjust the vertical alignment and size of the content. +% +% \DescribeKey{valign}'='<letter> +% This key allows to vertically align the content to the top, middle and bottom. The uppercase letters |T|, |M| and |B| +% align to the content top (i.e. all depth, no height), the geometric, vertical center (equal height and depth) and to +% the bottom (all height, no depth), respectively. This allows the alignment of content of different size, but will not +% result in good alignment with text. The lowercase letters |t|, |m| and |b| are aligning the content again to the top, +% center and bottom but take the current text size in account. +% The |t| letter leaves a certain height given by the macro\footnote{A macro and not a length is used to allow for +% font size relative values like \texttt{1ex}.} \Macro\adjboxvtop\relax +% (by default set to the height of \Macro\strut\relax, i.e.\ |\ht\strutbox|, which is |.7\baselineskip|), +% while |b| sets a certain depth given (as negative length) by the macro \Macro\adjboxvbottom\relax +% (by default equal to the (negated) \Macro\strut depth, i.e.\ |-\dp\strutbox|, which is |.3\baselineskip|). +% The |m| letter will center towards the vertical center of the text line which is determined by the macro +% \Macro\adjboxvcenter\relax (by default \texttt{1ex}). +% +% The following table shows the different alignments for three different sized blocks: +% +% \bigskip +% \begingroup +% \def\vr{% +% \unskip +% \tikz [gray] {\useasboundingbox (0,0); +% \draw (-13.5em,0) -- (2.25em,0); +% \draw (-13.5em,\adjboxvcenter) -- (2.25em,\adjboxvcenter); +% }% +% \unskip\ignorespaces +% }% +% \centerline{% +% \begin{tabular}{cccm{2em}} +% \toprule +% \texttt{T} & \texttt{M} & \texttt{B} & Text \\ +% \adjustbox{valign=T}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=T}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=T}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% \adjustbox{valign=M}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=M}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=M}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% \adjustbox{valign=B}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=B}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=B}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% Mxy \newline \mbox{\vr Mxy}\newline Mxy \\ +% \midrule +% \texttt{t} & \texttt{m} & \texttt{b} & Text \\ +% \adjustbox{valign=t}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=t}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=t}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% \adjustbox{valign=m}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=m}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=m}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% \adjustbox{valign=b}{\textcolor{red}{\rule{1em}{2em}\unskip}}\unskip +% \adjustbox{valign=b}{\textcolor{green}{\rule{1em}{3em}\unskip}}\unskip +% \adjustbox{valign=b}{\textcolor{blue}{\rule{1em}{1ex}\unskip}} & +% Mxy \newline \mbox{\vr Mxy}\newline Mxy \\ +% \bottomrule +% \end{tabular}} +% \endgroup +% +% +% \DescribeKey{raise}'='<amount> +% \DescribeKey{raise}'='{<amount>}{<height>} +% \DescribeKey{raise}'='{<amount>}{<height>}{<depth>} +% This key uses +% \Macro\raisebox{<amount>}{\ldots} to raise the content upwards for the given \meta{amount} (length). +% A negative length moves the content down. +% The two optional arguments of \Macro\raisebox{<amount>}[<height>][<depth>]{\ldots}\relax are also available +% as optional brace arguments. They can be used to set the official height and depth of the content. +% This is also possible using the \Key{set height} and \Key{set depth} keys. +% +% \begin{examples} +% \begin{examplecode} +% Is \adjustbox{raise=1ex}{higher} +% than the normal text +% \end{examplecode} +% \begin{examplecode} +% Is \adjustbox{raise={1ex}{\height}}{higher} +% than the normal text but sill has +% its original official height +% \end{examplecode} +% \begin{examplecode} +% Is \adjustbox{raise={1ex}{1ex}{0pt}}{higher and +% \rotatebox{-90}{deeper}} but with limited official +% height and no depth. +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{set height}'='<height> +% This sets the official height of the content without actual changing it. This can be seen as a form of trimming. +% It uses the same internal code as\\ +% \Macro\raisebox{'0pt'}[<height>]{<content>}. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{set height=.5\height} +% {\shortstack{some stacked\\content}} +% \end{examplecode} +% \end{example} +% +% \DescribeKey{set depth}'='<depth> +% This sets the official depth of the content without actual changing it. This can be seen as a form of trimming. +% It uses the same internal code as\\ +% \Macro\raisebox{'0pt'}['\height'][<depth>]{<content>}. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{set depth=0pt} +% {\shortstack{some stacked\\content +% with \raisebox{-1ex}{depth}}} +% \end{examplecode} +% \end{example} +% +% \DescribeKey{set vsize}'='{<height>}{<depth>} +% This sets the official height of depth of the content without actual changing it. +% This key is simply the combination of \Key{set height} and \Key{set depth}. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{set vsize={2pt}{1pt}} +% {\shortstack{some stacked\\content +% with \raisebox{-1ex}{depth}}} +% \end{examplecode} +% \end{example} +% +% +% ^^A )))2 +% \clearpage\subsection{Horizontal Alignment} ^^A (((2 +% The following keys can be used to adjust the horizontal alignment and size of the content. +% +% \DescribeKey{center} +% \DescribeKey{center}'='<width> +% This key places +% the content in a horizontal box which is by default \Macro\linewidth wide (i.e.\ as wide as a normal text paragraph) +% and centers it in it. The effect is very similar to \Macro\centerline. The original content is unchanged, but simply identical +% white space is added as a left and right margin. This is useful if the content is a figure or table and can be used as a replacement +% for \Macro\centering. One important difference is that the content will then have the given width which might influence (sub-)caption +% placement. +% If the content is wider than the available width it will stick out on both sides equally without causing an overfull hbox warning. +% Note that when \Macro\adjustbox paragraph is used at the beginning of a paragraph the normal paragraph indention is added, which +% will push the while box to the right and might cause an overfull line. In such cases a \Macro\noindent must be added beforehand. +% The \env{adjustbox} environment already uses this macro. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{center}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{center=5cm}{Some content} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{right} +% \DescribeKey{right}'='<width> +% Like \Key{center} this key +% places the content in a box with the given width (by default \Macro\linewidth) but right aligns it. +% If the content is wider than the available width it will stick out into the left side without causing an overfull hbox warning. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{right}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{right=5cm}{Some content} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{left} +% \DescribeKey{left}'='<width> +% Like \Key{center} this key +% places the content in a box with the given width (by default \Macro\linewidth) but left aligns it. +% If the content is wider than the available width it will stick out into the right side without causing an overfull hbox warning. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{left}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{left=5cm}{Some content} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{inner} +% \DescribeKey{inner}'='<width> +% Like \Key{center}, \Key{left} and \Key{right} this key +% places the content in a box with the given width (by default \Macro\linewidth) but aligns it towards the inner margin. +% If the content is wider than the available width it will stick into the outer margin without causing an overfull hbox warning. +% In |twoside| mode this key is equal to \Key{left} for odd pages and equal to \Key{right} for even pages. +% For |oneside| mode it is equal to \Key{left}. +% Note that the page-is-odd test might not always lead to correct results for some material close to a page boundary, because \TeX\ +% might not have decided on which page it will be placed. This can be improved by loading the \pkg{changepage} package with the +% \opt{strict} option, which uses a reference to determine the correct page number (and requires the usual additional compiler run). +% +% +% \DescribeKey{outer} +% \DescribeKey{outer}'='<width> +% Identical to \Key{inner} but aligns the content towards the outer margin. +% For |oneside| mode it is equal to \Key{right}. +% If the content is wider than the available width it will stick into the outer inner without causing an overfull hbox warning. +% +% +% \DescribeKey{pagecenter} +% \DescribeKey{pagecenter}'='<width> +% This key centers the content relative to the page and independent from the text area. Afterwards the content has the same distance to the +% left and right page borders. It differs from the \Key{center} key when the left and right page margins are different which is the case in +% |twoside| documents or in environments which change the margins. +% +% Note that the content will look misalign to the text paragraphs before and afterwards and is therefore only +% pleasing for overwide images or similar content. +% +% The optional width defaults to \Macro\linewidth and determines the official width of the content. If a smaller value is selected +% following material will be placed on the same line while maybe overlapping the content. +% Larger values will cause an |Overfull \hbox| warning. +% +% \DescribeKey{pageleftalign} +% \DescribeKey{pageleftalign}'='<width> +% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the left side of the page instead of centering it. +% +% \DescribeKey{pagerightalign} +% \DescribeKey{pagerightalign}'='<width> +% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the left side of the page instead of centering it. +% +% \DescribeKey{pageinner} +% \DescribeKey{pageinner}'='<width> +% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the inner side of the page instead of centering it. +% This assumes that the document is compiled in |twoside| mode. +% In |oneside| mode the macro is identical to \Key{pageleftalign}, i.e. always aligns to the left of the page. +% +% \DescribeKey{pageouter} +% \DescribeKey{pageouter}'='<width> +% Similar to \Key{pagecenter}\relax{} (see remarks there) but aligns the content on the outer side of the page instead of centering it. +% This assumes that the document is compiled in |twoside| mode. +% In |oneside| mode the macro is identical to \Key{pagerightalign}, i.e. always aligns to the right of the page. +% +% +% \DescribeKey{textareacenter} +% \DescribeKey{textareacenter}'='<width> +% This key centers the content on the text area (the box with size \Macro\textwidth$\times$\Macro\textheight containing the text on a page) +% even if the box is inside an indending environment like \env{enumerate}. For this it is assumed that the adjusted box is on the start +% of a line or paragraph. If this is not the case the content will be overlapping the material on its left side. +% +% The optional width defaults to \Macro\linewidth and determines the official width of the content. If a smaller value is selected +% following material will be placed on the same line while maybe overlapping the content. +% Larger values will cause an |Overfull \hbox| warning.% +% +% +% \DescribeKey{textareatalign} +% \DescribeKey{textareatalign}'='<width> +% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the left side of the text area instead of centering it. +% +% \DescribeKey{textareatalign} +% \DescribeKey{textareatalign}'='<width> +% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the left side of the text area instead of centering it. +% +% \DescribeKey{textareainner} +% \DescribeKey{textareainner}'='<width> +% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the inner side of the text area instead of centering it. +% This assumes that the document is compiled in |twoside| mode. +% In |oneside| mode the macro is identical to \Key{pageleftalign}, i.e. always aligns to the left of the text area. +% +% \DescribeKey{textareaouter} +% \DescribeKey{textareaouter}'='<width> +% Similar to \Key{textareacenter}\relax{} (see remarks there) but aligns the content on the outer side of the text area instead of centering it. +% This assumes that the document is compiled in |twoside| mode. +% In |oneside| mode the macro is identical to \Key{pagerightalign}, i.e. always aligns to the right of the text area. +% +% +% +% \DescribeKey{noindent} +% This key will issue an \Macro\noindent for the \Macro\adjustbox to avoid a paragraph indention if it starts a paragraph. +% It does not expect a value and will ignore it if provided. +% +% +% \DescribeMacro\centerbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{centerbox}[<width>] +% Macro and environment version of the \Key{center} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\leftalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{leftalignbox}[<width>] +% Macro and environment version of the \Key{left} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\rightalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{rightalignbox}[<width>] +% Macro and environment version of the \Key{rightalign} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\innersidebox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{innersidebox}[<width>] +% Macro and environment version of the \Key{inner} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\outersidebox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{outersidebox}[<width>] +% Macro and environment version of the \Key{outer} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\centerpagebox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{centerpagebox}[<width>] +% Macro and environment version of the \Key{centerpage} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% +% \DescribeMacro\pagecenterbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{pagecenterbox}[<width>] +% Macro and environment version of the \Key{pagecenterbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\pageleftalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{pageleftalignbox}[<width>] +% Macro and environment version of the \Key{pageleftalignbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\pagerightalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{pagerightalignbox}[<width>] +% Macro and environment version of the \Key{pagerightalignbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\pageinnerbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{pageinnerbox}[<width>] +% Macro and environment version of the \Key{pageinnerbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\pageouterbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{pageouterbox}[<width>] +% Macro and environment version of the \Key{pageouterbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\textareacenterbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{textareacenterbox}[<width>] +% Macro and environment version of the \Key{textareacenterbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\textareatalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{textareatalignbox}[<width>] +% Macro and environment version of the \Key{textareatalignbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\textareatalignbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{textareatalignbox}[<width>] +% Macro and environment version of the \Key{textareatalignbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\textareainnerbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{textareainnerbox}[<width>] +% Macro and environment version of the \Key{textareainnerbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \DescribeMacro\textareaouterbox[<width>]{<content>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{textareaouterbox}[<width>] +% Macro and environment version of the \Key{textareaouterbox} key. The optional width argument defaults to \Macro\linewidth. +% Both include a \Macro\noindent to avoid paragraph indention. If an paragraph indention is wanted it can be created by +% placing a |\mbox{}| or the identical |\null| macro before it. +% +% \clearpage\subsection*{Lapping} ^^A (((3 +% The following features can be used to make the content lap over its left or right boundary. This is basically the same +% as trimming, but provides a different, more dedicated interface. +% +% +% \DescribeKey{lap}'='<lap amount> +% \DescribeKey{lap}'='{<length>}{<lap amount>} +% This key will make the content lap over the surrounding elements to the right or left by the given amount.. +% A positive amount will make the content lap over to the right +% and a negative one to the left. The optional \meta{length} argument allows to set the final width. +% If not used the resulting width will be the original width minus the absolute lap amount. +% This key internally uses \Macro\lapbox{<lap amount>}{\ldots} and \Macro\lapbox[<length>]{<lap amount>}{\ldots}, respectively. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{lap=.5\width}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{lap=-.5\width}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{lap=\width}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{lap=-\width}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{lap={\width}{\width}}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{lap={\width}{-\width}}{Some content} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{rlap} +% \DescribeKey{llap} +% This makes the content to be officially 0pt wide and lap over to the right or left, respectively, like the \LaTeX\ macros \Macro\rlap and \Macro\llap do. +% These are shortcuts for \Key{lap}'='\AlsoMacro\width and \Key{lap}'=-'\AlsoMacro\width, respectively. The values for these keys are ignored and should not be used. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{rlap}{Some content} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{llap}{Some content} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeMacro\lapbox[<width>]{<lap amount>}{<content>} +% This macro is a generalisation of the \LaTeX\ core macros \Macro\rlap{<content>} and \Macro\llap{<content>} which lap the +% text to the right or left without taking any official space. The \Macro\lapbox macro can be used to only partially lap +% the content to the right (positive amount) or left (negative amount). As with all macros of this package the original width +% can be references using \Macro\width. The resulting official width of the box is normally the original width minus the absolute +% lap amount. However, it can also be set explicitly using the option argument. +% It is also possible to use lap amount which absolute values are larger than the original width. In this case the resulting +% official width will be zero by default and the content will padded with the required white space. +% Note that the lap amount always states the distance between the right side of the official box and the right side of the actual +% content for positive amounts or the distance between the left side of the official box and the left side of the actual content +% for negative values. +% +% \begin{examples} +% General lapping: +% \begin{examplecode} +% \lapbox{1cm}{Some Text} +% \end{examplecode} +% \vspace{-2\smallskipamount}% +% \begin{examplecode} +% \lapbox{-1cm}{Some Text} +% \end{examplecode} +% \vspace{-2\smallskipamount}% +% \begin{examplecode} +% \lapbox[4cm]{1cm}{Some Text} +% \end{examplecode} +% \vspace{-2\smallskipamount}% +% \begin{examplecode} +% \lapbox[3cm]{2cm}{Some Text} +% \end{examplecode} +% \vspace{\smallskipamount}% +% Like \Macro\rlap: +% \vspace{-\smallskipamount}% +% \begin{examplecode} +% \lapbox[0pt]{\width}{Some Text} +% \end{examplecode} +% \vspace{\smallskipamount}% +% Like \Macro\llap: +% \vspace{-\smallskipamount}% +% \begin{examplecode} +% \lapbox[0pt]{-\width}{Some Text} +% \end{examplecode} +% \vspace{\smallskipamount}% +% A centering \Macro\clap macro can be achieved using: +% \vspace{-\smallskipamount}% +% \begin{examplecode} +% \lapbox[0pt]{-.5\width}{Some Text} +% \end{examplecode} +% \vspace{-2\smallskipamount}% +% \begin{examplecode} +% \lapbox[0pt]{.5\width}{Some Text} +% \end{examplecode} +% +% \end{examples} +% +% +% ^^A )))3 +% ^^A )))2 +% \clearpage\subsection{Support for \pkg{graphicx} keys} ^^A (((2 +% +% \DescribeKey{bbllx}'='<length> +% \DescribeKey{bblly}'='<length> +% \DescribeKey{bburx}'='<length> +% \DescribeKey{bbury}'='<length> +% \DescribeKey{decodearray} +% \DescribeKey{intent} +% \DescribeKey{interpolate} +% \DescribeKey{maskarray} +% \DescribeKey{natheight}'='<length> +% \DescribeKey{natwidth}'='<length> +% \DescribeKey{ocobjnum} +% \DescribeKey{ocobjref} +% \DescribeKey{page}'='<page numbers> +% \DescribeKey{pagebox} +% \DescribeKey{print} +% \DescribeKey{quiet} +% \DescribeKey{resetcolor} +% \DescribeKey{resolution} +% \DescribeKey{xmpfile} +% The above \pkg{graphicx} keys are also supported by \cs{adjustbox}. This is done by relying on the original +% \pkg{graphicx} code, i.e. the key code is copied into the \pkg{adjustbox} namespace. These keys are therefore +% mostly for use with images and might not work well with other content. +% For more details on these keys see the \pkg{graphicx} manual. +% +% ^^A )))2 +% \clearpage\subsection{Colors} ^^A (((2 +% \vspace{-\baselineskip} +% +% \DescribeKey{color}'='<color> +% \DescribeKey{color}'='{<model>}{<color>} +% This key sets the color for all material. Both the content and further material added by other keys will be affected. +% The color change is immediate and will occur before basically every other key takes effect. +% The order in which this key is used is therefore meaningless. +% Using this key several times will cause several color changes with the last one be used for the remaining material. +% Note that \Key{color} will not influence any \Key{fgcolor} or \Key{bgcolor} beside the fact that it changes the +% \emph{current color} accessible using the special name `|.|'. +% +% \DescribeKey{color*}'='<color macro> +% Like \Key{color} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors. +% See the \pkg{xcolor} manual for more details. A \Macro\blendcolors will affect both \Key{fgcolor} and \Key{bgcolor}. +% +% +% \DescribeKey{fgcolor}'='<color> +% \DescribeKey{fgcolor}'='{<model>}{<color>} +% This key sets the color for the content. +% The value is passed to an internal \Macro\color macro. +% This is done using \Key{innercode} because the color must be set before the content is boxed. +% Further material added using keys, e.g.\ a \Key{frame}, is not affected by this key. +% The \pkg{xcolor} package (or \pkg{color} or \pkg{xxcolor}) needs to be loaded otherwise an error will be raised. +% +% \DescribeKey{fgcolor*}'='<color macro> +% Like \Key{fgcolor} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors. +% See the \pkg{xcolor} manual for more details. +% +% +% \DescribeKey{bgcolor}'='<color> +% \DescribeKey{bgcolor}'='{<model>}{<color>} +% This key adds a colored background to the content. The \pkg{xcolor} package (or \pkg{color} or \pkg{xxcolor}) needs to be loaded +% as well in order for this to work. The value is passed to an internal \Macro\color macro. +% \begin{examples} +% \begin{examplecode} +% \adjustbox{bgcolor=blue}{Text with blue background.} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{bgcolor={rgb}{0 0 1}}{Text with blue background in the RGB color model.} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{margin=1ex,bgcolor=green}{green with a little more margin} +% \end{examplecode} +% \begin{examplecode} +% \adjustbox{margin=1ex,bgcolor=green,margin=1pt,bgcolor=yellow}{Emulation of colored frame} +% \end{examplecode} +% \end{examples} +% +% \DescribeKey{bgcolor*}'='<color macro> +% Like \Key{bgcolor} but awaits a full color macro as value. This allows to use other macros as \Macro\color like \Macro\blendcolors. +% See the \pkg{xcolor} manual for more details. +% +% \begin{examples} +% \begin{examplecode} +% \color{blue}Blue text +% \adjustbox{bgcolor*=\blendcolors{!10!yellow}\color{.}}{with a yellow-bluish background} +% \end{examplecode} +% \begin{examplecode} +% \color{green}Green text +% \adjustbox{bgcolor*=\blendcolors{!10!yellow}\color{.}}{with a yellow-greenish background} +% \end{examplecode} +% \end{examples} +% +% \DescribeMacro{\bgcolorbox}[<model>]{<color>} +% \DescribeMacro{\bgcolorbox}*{<color macro>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{bgcolorbox}[<model>]{<color>} +% \vspace{-1.5\baselineskip}\nopagebreak +% \DescribeEnv[<content>]{bgcolorbox*}{<color macro>} +% Standalone macro and environment versions of the \Key{bgcolorbox} and \Key{bgcolorbox*} keys. +% +% +% +% ^^A )))2 +% \clearpage\subsection{Background and Forground Images and Text} ^^A (((2 +% The following keys, macros and environment allow to add background and foreground layers. +% These layers are placed on the baseline of the original content and are horizontally centered, but can be adjusted +% using own \Macro\adjustbox or \Macro\includegraphics keys. +% The following dimension registers can be used to refer to the dimensions of the original content. +% +% \DescribeMacros +% \hbox{\Macro\pwidth~~~\Macro\pheight~~~\Macro\pdepth~~~\Macro\ptotalheight}% +% \endDescribeMacros +% These dimension registers hold the width, height, depth and total height (height+depth) of the parent box and can be used +% to resize a background or foreground layer accordantly. They are only defined inside the key=value arguments of the +% following keys, macros and environments. +% +% \DescribeKey{bgimage}'='<image filename> +% \DescribeKey{bgimage}'='{<key=value pairs for image>}{<image filename>} +% Adds a background image to the content. The image is stretched if required to fit exactly to the content. +% It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the image (before the resizing is done). +% \begin{examples} +% \begin{examplecode} +% \adjustbox{bgimage=example-grid-100x100bp}{Some text} +% \end{examplecode} +% \end{examples} +% +% \DescribeKey{bgimage*}'='<image filename> +% \DescribeKey{bgimage*}'='{<key=value pairs for image>}{<image filename>} +% Adds a background image to the content like \Key{bgimage} but the image is not stretched to fit the content. +% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys. +% The image is placed on the baseline of the content and horizontally centered. It can be lowered to the lower edge of +% the content using \Key{raise}'=-'\AlsoMacro\pdepth and left aligned using \Key{left}'='\AlsoMacro\pwidth etc. +% +% \DescribeMacro{\bgimagebox}[<key=value pairs>]{<image filename>} +% \DescribeMacro{\bgimagebox}*[<key=value pairs>]{<image filename>} +% \DescribeEnv[<content>]{bgimagebox}[<key=value pairs>]{<image filename>} +% \DescribeEnv[<content>]{bgimagebox*}[<key=value pairs>]{<image filename>} +% Standalone macro and environment versions of the \Key{bgimage} and \Key{bgimage*} keys. +% +% +% \DescribeKey{fgimage}'='<image filename> +% \DescribeKey{fgimage}'='{<key=value pairs for image>}{<image filename>} +% Adds a foreground image to the content. The image is stretched to fit exactly to the content. +% It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the image (before the resizing is done). +% The image is assumed to have transparent elements, otherwise the existing content is fully covered. +% +% \DescribeKey{fgimage*}'='<image filename> +% \DescribeKey{fgimage*}'='{<key=value pairs for image>}{<image filename>} +% Adds a foreground image to the content like \Key{fgimage} but the image is not stretched to fit the content. +% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys. +% The image is placed on the baseline of the content and horizontally centered. +% +% \DescribeMacro{\fgimagebox}[<key=value pairs>]{<image filename>} +% \DescribeMacro{\fgimagebox}*[<key=value pairs>]{<image filename>} +% \DescribeEnv[<content>]{fgimagebox}[<key=value pairs>]{<image filename>} +% \DescribeEnv[<content>]{fgimagebox*}[<key=value pairs>]{<image filename>} +% Standalone macro and environment versions of the \Key{fgimage} and \Key{fgimage*} keys. +% +% +% +% \DescribeKey{background}'='<background content> +% \DescribeKey{background}'='{<key=value pairs for image>}{<background content>} +% Adds the given content as background layer to the main content. The background content is stretched to fit the size of +% the main content. It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the +% background content (before the resizing is done). +% \begin{examples} +% \begin{examplecode} +% \adjustbox{background={\color{red}xxx}}{Some text} +% \end{examplecode} +% \end{examples} +% +% \DescribeKey{background*}'='<background content> +% \DescribeKey{background*}'='{<key=value pairs for image>}{<background content>} +% Like \Key{background} but does not resizes the background content. +% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys. +% +% \DescribeMacro{\backgroundbox}[<key=value pairs>]{<background content>} +% \DescribeMacro{\backgroundbox}*[<key=value pairs>]{<background content>} +% \DescribeEnv[<content>]{backgroundbox}[<key=value pairs>]{<background content>} +% \DescribeEnv[<content>]{backgroundbox*}[<key=value pairs>]{<background content>} +% Standalone macro and environment versions of the \Key{background} and \Key{background*} keys. +% +% +% \DescribeKey{foreground}'='<foreground content> +% \DescribeKey{foreground}'='{<key=value pairs for content>}{<foreground content>} +% Adds the given content as foreground layer to the main content. The foreground content is stretched to fit the size of +% the main content. It is also possible to provide \Macro\adjustbox or \Macro\includegraphics keys to modify the +% foreground content (before the resizing is done). +% \begin{examples} +% \begin{examplecode} +% \adjustbox{foreground={\color{red}xxx}}{Some text} +% \end{examplecode} +% \end{examples} +% +% \DescribeKey{foreground*}'='<foreground content> +% \DescribeKey{foreground*}'='{<key=value pairs for content>}{<foreground content>} +% Like \Key{foreground} but does not resizes the foreground content. +% Instead it is added in its natural size but can be adjusted using \Macro\adjustbox or \Macro\includegraphics keys. +% +% \DescribeMacro{\foregroundbox}[<key=value pairs>]{<foreground content>} +% \DescribeMacro{\foregroundbox}*[<key=value pairs>]{<foreground content>} +% \DescribeEnv[<content>]{foregroundbox}[<key=value pairs>]{<foreground content>} +% \DescribeEnv[<content>]{foregroundbox*}[<key=value pairs>]{<foreground content>} +% Standalone macro and environment versions of the \Key{foreground} and \Key{foreground*} keys. +% +% +% +% ^^A )))2 +% \clearpage\subsection{Density / Pixel size} ^^A (((2 +% The following keys allow to adjust the effective length of |pdftex| special |px| (pixel) unit. +% This can be required for images which do not have the correct DPI meta-data included. +% +% +% \DescribeKey{dpi}'='<number (dots per inch)> +% The \Key{dpi} key provides a simple interface to set the pixel size to the given DPI (dots per inch) value. +% For |pdflatex| the length unit |px| can be used to specify pixels. However, the equivalent dimension (length) of one pixel must be +% set using the \Macro\pdfpxdimen length register. To set a specific DPI value this length must be set using +% \Macro\setlength\AlsoMacro\pdfpxdimen{'1in/'<dots>}, which is done by the \Key{dpi}'='<dots> key. +% Note that the key won't affect the setting for the content but only for the further used keys. +% However, it is possible to use \Macro\setkeys{adjbox}{'dpi='<number>} inside the content or anywhere else in the document to +% set \Macro\pdfpxdimen using this interface. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{dpi=72,trim=10px,frame}{% +% \setkeys{adjbox}{dpi=72}% +% \textcolor{green}{\rule{50px}{50px}}% +% } +% \end{examplecode} +% \end{example} +% +% \DescribeKey{pxdim}'='<length> +% Alternatively +% to the \Key{dpi} key the \Macro\pdfpxdimen length can be set directly to the given value. Afterwards |1px| will stand +% for the given \meta{length}. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{pxdim=2pt,trim=2px,frame} +% {\textcolor{green}{\rule{20pt}{20pt}}} +% \end{examplecode} +% \end{example} +% +% +% ^^A )))2 +% \clearpage\subsection{Minipage or other inner environments which change the processing of the content}\label{sec:inner} ^^A (((2 +% The following keys set the way the content is processed before it is stored it in a box. +% These keys will overwrite each other and only the latest used key will take effect. +% Because they affect the inner content directly their order relative to other, normal keys is not meaningful. +% Also they are only defined for \env{adjustbox} but do not apply for \Macro\includegraphics. +% Because they are therefore only used inside a mandatory argument and never in an optional these keys allow for optional bracket arguments. +% +% \DescribeKey{minipage}'='<width> +% \DescribeKey{minipage}'='[<position>][<height>][<inner position>]{<width>} +% This key wraps the inner content in a \env{minipage} with the given \meta{width} before it is stored as horizontal box. +% Its order relative to other keys is not meaningful (except that future keys of this sub-section will overwrite it). +% This allows for line breaks and footnotes in the \env{adjustbox}. +% All optional arguments of \env{minipage} are supported. I only the width is given it does not have to be enclosed in braces. +% The \meta{position} argument must be "t" for top baseline, "b" for bottom baseline and "c" for center alignment relative to other +% text, i.e.\ defines the resulting baseline. If a \meta{height} is defined the \meta{inner position} defaults to \meta{position} but +% can also be "s" to stretch the content over the whole height. This requires the content to include some vertical stretchable material. +% Note that all length arguments can include arithmetic expressions like for other keys. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{minipage=5cm,angle=-10}{% +% Some example code which will +% be automatically broken or can include \\ +% line breaks\footnote{AND footnotes!!}\\ +% or verbatim \verb+@%^&}_+!% +% } +% \end{examplecode} +% \begin{examplecode} +% Before \begin{adjustbox}{minipage=[b][3cm][s]{5cm}} +% Some example code +% +% \vfill +% with line breaks\footnote{AND footnotes!!} +% +% \vfill +% or verbatim \verb+@%^&}_+!% +% \end{adjustbox} After +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{varwidth}'='<width> +% Adds a \env{varwidth} environment from the \pkg{varwidth} package around the content. This is similar to the +% \env{minipage} environment but the final width of the content will be as large as the widest line in the content up to +% the maximum amount given by the width argument. +% This environment key is vert useful if the content produces some paragraph material which can't be stored in an +% horizontal box directly. +% +% +% \DescribeKey{tabular}'='[<position>]{<column specification>} +% \DescribeKey{tabular*}'='[<position>]{<width>}{<column specification>} +% \DescribeKey{array}'='[<position>]{<column specification>} +% Places the content in a \env{tabular}, \env{tabular*} or \env{array} environment, respectively. +% These keys require different implementations for macro (\Macro\adjustbox) and environment mode (\env{adjustbox} environment) in order to insert +% the end code correctly. Note that the environment mode is more efficient and fully stable, while the macro mode requires the last row to end with +% an explicit |\\| (which can be followed by \Macro\hline or any other macro which uses \Macro\noalign internally). In macro mode the |\\| is internally redefined +% to check for the closing brace. While this was successful tested for normal usages it might still cause issues with unusual or complicated cases. +% Note that these environments are taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported. +% +% \begin{examples} +% \begin{examplecode} +% \adjustbox{tabular=lll}{% +% \hline +% A & B & C \\\hline +% a & b & c \\\hline +% } +% \end{examplecode} +% \begin{examplecode} +% \begin{adjustbox}{tabular=lll} +% A & B & C \\ +% a & b & c +% \end{adjustbox} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeKey{stack} +% \DescribeKey{stack}'='<horizontal alignment> +% \DescribeKey{stack}'='{<horizontal alignment>}{<vertical alignment>} +% \Descsep +% \DescribeMacro\stackbox!\optionaloff![<horizontal alignment>][<vertical alignment>]{<content>} +% \Descsep +% \DescribeEnv[<content>]{stackbox}[<horizontal alignment>][<vertical alignment>] +% The \Key{stack} key and its corresponding macro and environment can be used to stack multiple lines similar to the \Macro\shortstack macro, but +% both the horizontal and vertical alignment can be selected by a single letter each. Also a proper baseline skip is inserted. +% This is implemented using the \env{varwidth} environment which is based on the \env{minipage} environment. +% Its maximal width arguments is fixed internally to \Macro\linewidth. +% +% Possible horizontal alignments are: "l" (left), "r" (right), "c" (centered, default), "j" (justified). +% Possible vertical alignments are the same as for \env{minipage}: "t" (top baseline), "b" (bottom baseline, default), "c" (vertical centered). +% Because these arguments are always single letters the "{ }" around them can be skipped, so that the value can simple be two concatenated letters. +% +% \begin{example} +% \begin{examplecode} +% .\adjustbox{stack}{A\\B\\CC}. +% \end{examplecode} +% \begin{examplecode} +% .\adjustbox{stack=r}{A\\B\\CC}. +% \end{examplecode} +% \begin{examplecode} +% .\adjustbox{stack=ct}{A\\B\\CC}. +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{innerenv}'='<environment name> +% \DescribeKey{innerenv}'='{<environment name>}<environment options> +% Wraps the inner content in the given \meta{environment} before it is stored as horizontal box. +% It should be kept in mind that there is some internal code between the begin of the environment and the content. For this reason +% a \env{tabular}, \env{array} or similar environment will not work here, because that code will be taken as part of the first cell. +% Note that such a environment is taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported. +% +% \begin{example} +% \begin{examplecode} +% \newenvironment{myenv}[2][]{Before [#1](#2)}{After} +% \adjustbox{innerenv={myenv}[ex]{amble}}{Content} +% \end{examplecode} +% \newenvironment{myenv}[2][]{Before [#1](#2)}{After} +% \begin{examplecode} +% \adjustbox{innerenv={myenv}{amble}}{Content} +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{innercode}'='{<begin code>}{<end code>} +% Places the given code before and after the inner content before it is stored as horizontal box. +% Note that such code is taken as part of the content and so the usage of arithmetic expressions for length arguments is not supported. +% +% \begin{example} +% \begin{examplecode} +% \adjustbox{innercode={\color{green}}{!}}{Content} +% \end{examplecode} +% \end{example} +% +% ^^A )))2 +% \clearpage\subsection{Floats and non-float replacements} ^^A (((2 +% The following keys can be used to turn an adjusted box into a float or a non-floating replacement which also allows +% for a caption. These keys must be used last and no other normal keys must be used afterwards, otherwise an error will +% occur because the added floating environment is boxed again. +% +% +% \DescribeKey{caption}=<caption text> +% \DescribeKey{caption}=[<short caption>]{<long caption>} +% Defines a caption which will be used by a following \Key{figure}, \Key{float} or \Key{nofloat} key. +% The position of the caption defaults to top for a |table| (non-)float and bottom for every other type. +% +% \DescribeKey{captionabove}=<caption text> +% \DescribeKey{captionabove}=[<short caption>]{<long caption>} +% Like the \Key{caption} key but forces the placement of the caption above the content. +% The vertical skip above and below a normal below caption are reversed in this case to get proper +% spacing. However, this is not done if the \pkg{caption} package is loaded. +% It is recommended to load this package with the |tableposition=above| option. +% +% +% \DescribeKey{captionbelow}=<caption text> +% \DescribeKey{captionbelow}=[<short caption>]{<long caption>} +% Like the \Key{caption} key but forces the placement of the caption below the content. +% +% +% \DescribeKey{label}=<label> +% Defines a label which will be used by a following \Key{figure}, \Key{float} or \Key{nofloat} key. +% +% +% \DescribeKey{figure} +% \DescribeKey{figure}=<placement> +% Turns the adjusted box into a \env{figure}. +% A previously used \Key{caption} and \Key{label} will be added. +% This is a specialised version of \Key{float}={figure}. +% +% +% \DescribeKey{float}=<float type> +% \DescribeKey{float}={<float type>}[<position>] +% Turns the adjusted box into a float of the given type, i.e.\ |figure|, |table| or any other custom defined float. +% A previously used \Key{caption} and \Key{label} will be added. +% +% +% \DescribeKey{nofloat}=<float type> +% This will add a non-floating replacement of the given float type (|figure|, |table|, etc.). +% The will place the content always at the current +% position which can lead to bad page-breaking. A caption will be in the same format as for real floats of the same +% type. +% A previously used \Key{caption} and \Key{label} will be added. +% +% \DescribeEnv[<content>]{adjnofloat}{<float type>} +% This environment is used internally by \Key{nofloat} to create a non-floating replacement of the given float type +% (|figure|, |table|, etc.). It can also be used directly with other code or be redefined to change the +% behavior of \Key{nofloat}. +% Any redefinition should include |\adjbox@nofloatcaptionsetup{#1}| to set the caption type. +% The environment will be used in plain form, i.e.\ \Macro\adjnofloat\ldots\Macro\endadjnofloat, so +% if a group is required in a redefinition it should be added manually using \Macro\begingroup and \Macro\endgroup. +% +% +% +% ^^A )))2 +% \Needspace*{8\baselineskip} +% \clearpage\subsection{Adding own Code or Environments} ^^A (((2 +% \vspace{-\baselineskip} +% +% \DescribeKey{env}'='<environment name> +% \DescribeKey{env}'='{<environment name>}<environment options> +% Adds an \meta{environment} around the content and the already existing code around it which was added by other keys beforehand. +% Potential \meta{environment options} (or any other code) can follow the environment name if it was set inside braces. +% At this stage the content is already boxed and format macros won't have any effect on any included text. For this the \Key{innerenv} key needs to be used instead. +% +% \DescribeKey{addcode}'='{<code before>}{<code afters>} +% Adds some \meta{code before} and some \meta{code after} the content and the +% already existing code around it which was added by other keys beforehand. +% At this stage the content is already boxed and format macros won't have any effect on any included text. +% This key sets +% the size of the content before adding the code, i.e.\ keys like \Key{width} or \Key{scale} are executed on the content +% beforehand. +% +% \DescribeKey{Addcode}'='{<code before>}{<code afters>} +% Identical to \Key{addcode} but does not sets the size of the content first. +% +% \DescribeKey{appcode}'='<code afterwards> +% Appends the given \LaTeX\ code after the currently accumulated content. Note that this is the original content of the adjusted box \emph{and} all code +% added by the previous keys. +% +% It is recommended to wrap complex code into braces. +% +% \DescribeKey{precode}'='<code before> +% Prepends the given \LaTeX\ code before the currently accumulated content. Note that this is the original content of the adjusted box \emph{and} all code +% added by the previous keys. The content is wrapped into curly braces, so the given code can use it as a macro argument. +% This key sets the size of the content before adding the code, i.e.\ keys like \Key{width} or \Key{scale} are executed on the content +% beforehand. +% +% It is recommended to wrap complex code into braces. +% +% +% \DescribeKey{Precode}'='{<code before>} +% Identical to \Key{precode} but does not sets the size of the content first. +% +% +% \DescribeKey{execute}'='<code> +% Simply executes the code immediately. This is done in the key processing phase and is intended mostly for debugging purposes. +% Previous (normal) keys won't have an effect yet. +% +% \DescribeKey{Execute}'='<code> +% Simply executes the code immediately. This is done in the key processing phase for inner environments (see \autoref{sec:inner}) and is intended mostly for debugging purposes. +% Only previously used special keys for modifying the boxing of the content will have an effect yet. % All other keys are not yet processed. +% +% +% ^^A )))2 +% \clearpage\subsection{Change or discard content} ^^A (((2 +% \vspace{-\baselineskip} +% +% \DescribeKey{phantom} +% \DescribeKey{phantom}'=h' +% \DescribeKey{phantom}'=v' +% This key replaces the content with an empty phantom box of the same dimension. +% If the "h" or "v" value is used the box will only have the same horizontal size or vertical sizes (height and depth) +% while using zero for the other dimension(s). For this the standard \LaTeX\ macros \Macro\phantom, \Macro\hphantom and +% \Macro\vphantom are used internally. +% +% +% \DescribeMacro\phantombox{<width>}{<height>}{<depth>} +% This macro produces an empty box with the given width, height and depth. +% It is equivalent to \Macro\phantom{\AlsoMacro\rule['-'<depth>]{<width>}{<height>'+'<depth>}} but more efficient and more user friendly. +% +% \begin{example} +% \begin{examplecode} +% Before \fbox{\phantombox{1cm}{2ex}{1ex}} After +% \end{examplecode} +% \end{example} +% +% +% \DescribeKey{gobble} +% \DescribeKey{discard} +% These two keys are aliases and will discard the content after it was fully processed. Any keys used after one of this +% keys will operate on an empty content. These keys can be used in combination of the \Key{gstore ...} keys to only +% measure but not typeset some content. +% +% \DescribeKey{content}'='<new content> +% This key discards the current content completely after it was fully processed and all earlier keys were applied +% and sets the content to the given \meta{new content}. This can be used to implement some draft box or censoring +% features. +% +% \newlength\somelengtha +% \newlength\somelengthb +% \begin{example} +% \begin{examplecode} +% \adjustbox{frame,rotate=-30,gstore sizes=\somelengtha{}{}\somelengthb, +% content={Censored!},rotate=30,totalheight=\somelengtha,width=\somelengthb,frame} +% {The real content} +% \end{examplecode} +% \end{example} +% +% +% +% ^^A )))2 +% \clearpage\subsection{Store box content } ^^A (((2 +% +% \DescribeKey{gstore}'='<\textbackslash boxregister> +% \DescribeKey{gstore*}'='<\textbackslash boxregister> +% These keys globally store the current content into the given box register. +% With the normal version the content is still preserved and can be further adjusted. +% With the starred version the content will be consumed and further keys will be applied to an empty content. +% +% \DescribeKey{gstore width}'='<\textbackslash lengthregister> +% \DescribeKey{gstore height}'='<\textbackslash lengthregister> +% \DescribeKey{gstore depth}'='<\textbackslash lengthregister> +% \DescribeKey{gstore totalheight}'='<\textbackslash lengthregister> +% These key globally store the width, height, depth and totalheight into a length register, respectively. +% The content will not be altered by these keys. There are no starred versions like for \Key{gstore}. +% If the content should only be measured but not typeset the \Key{gobble}/\Key{discard} key can be used afterwards. +% +% \DescribeKey{gstore sizes}'='<\textbackslash lengthregister><\textbackslash lengthregister><\textbackslash lengthregister><\textbackslash lengthregister> +% Stores all four size values (width, height, depth and totalheight) of the content in the given length registers. +% This key should be used if more than one dimension should be stored, because it is much more efficient than using +% multiple of the above keys. +% If a dimension is not required it can be replaced by an empty argument, i.e.\ `|{}|'. +% Trailing dimensions can be skipped altogether if they are not required. +% +% +% ^^A )))2 +% \clearpage\subsection{Experimental Keys} ^^A (((2 +% The following features are experimental and may not work correctly yet. +% At the moment the \pkg{storebox} package must be loaded manually for this keys. +% +% \DescribeMacro\splitbox{<split width>}{<split height>}{<content>} +% This macro boxes the given content and splits it in multiple fragments of the given width and height. +% This is done row by row starting from the upper left corner. The last column and row can have a smaller size than requested. +% Every fragment is placed using \Macro\splitboxcmd{<fragment box>} which is empty by default but can be redefined to e.g.\ draw +% a frame around each fragment. After every row except the last the macro \Macro\splitboxnewline is inserted which defaults to |\\|, +% but can also be redefined freely. After the last row the macro \Macro\splitboxlastnewline is inserted which defaults to \Macro\splitboxnewline. +% +% The \Macro\splitbox content is stored using \Macro\storebox from the \pkg{storebox} package and therefore the whole content should only +% be stored once in the output file if the format is supported by that package (currently only PDF). +% +% \DescribeEnv[<content>]{splitbox}{<split width>}{<split height>} +% Environment version of \Macro\splitbox. +% +% \DescribeKey{split}'='{<split width>}{<split height>} +% The \Key{split} key can be used with \Macro\adjustbox and uses \Macro\splitbox internally. +% +% \DescribeMacro\pagebreakbox{<content>} +% The \Macro\pagebreakbox macro will split the content into multiple parts so that if fits on the current page. +% If it is larger than the rest of the current page and the full next page it is broken again until the last part fits on a page. +% This doesn't take any baselines into account and text line in the content may be split in two. +% This might be compensated manually by redefining the \Macro\pagebreakboxoffset macro (default: `|\ht\strutbox|'), which adjust the vertical offset +% of the first part. +% +% \DescribeEnv{pagebreakbox} +% Environment version of \Macro\pagebreakbox. +% +% \DescribeKey{pagebreak} +% The key version of \Macro\pagebreakbox. There should no be any further keys used afterwards, because they will interfere with the page breaks. +% +% +% ^^A )))2 +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Defining own Keys} ^^A ((( +% The following macros can be used to define own keys or redefine existing ones. +% +% \DescribeMacro\newadjustboxkey{<key>}[<default value>]{<code>} +% \DescribeMacro\newadjustboxkey*{<key>}[<default value>]{<code>} +% Defines the new \env{adjustbox} key with the given default value if no value is provided. +% The value can be accessed inside the code as |#1| +% Without a default value an error is raised if the value is missing. +% An error is raised if the key is already defined. +% +% The normal form will add the code to the internal token register just before the previous content which is +% wrapped inside braces: \MacroArgs<code>{<previous content>}. Subsequent keys will receive this as content. +% The code can therefore read the content as macro argument. If the dimension of the content need to be accessed +% it should be boxed first using \Macro\collectbox{<code>}. Then the dimension are available using the usual +% macros and the content can be typeset using \Macro\BOXCONTENT. See the \pkg{collectbox} for additional information. +% +% The starred form simply executes the given code in the internal group without changing the token register. +% In this case the content is not directly accessible and all subsequent keys are not yet processed. +% This form is useful to locally change settings for the current \Macro\adjustbox macro or \env{adjustbox} environment. +% +% +% \DescribeMacro\renewadjustboxkey{<key>}[<default value>]{<code>} +% \DescribeMacro\renewadjustboxkey*{<key>}[<default value>]{<code>} +% Like \Macro\newadjustboxkey but will redefine an existing key. +% An error is raised if the key is not already defined. +% +% +% \DescribeMacro\provideadjustboxkey{<key>}[<default value>]{<code>} +% \DescribeMacro\provideadjustboxkey*{<key>}[<default value>]{<code>} +% Like \Macro\newadjustboxkey but will define the key only if it is not already defined. +% +% +% \DescribeMacro\defadjustboxkey{<key>}[<default value>]{<code>} +% \DescribeMacro\defadjustboxkey*{<key>}[<default value>]{<code>} +% Like \Macro\newadjustboxkey but will always define the key independent if it is already defined or not. +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \StopEventually{} +% \clearpage% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \clearpage\section{Implementation} ^^A ((( +% \setcounter{lstnumber}{1} +% +% \iffalse +%<*adjustbox.sty> +% \fi +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Package header, options and dependencies} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesPackage{adjustbox}[% +%<!DATE> +%<!VERSION> +%<*DRIVER> + 2099/01/01 develop +%</DRIVER> + Adjusting TeX boxes (trim, clip, ...)] +% \end{macrocode} +% +% Load the packages required for the options. +% \begin{macrocode} +\RequirePackage{xkeyval} +\RequirePackage{adjcalc} +% \end{macrocode} +% +% Declare normal options. +% \begin{macrocode} +\def\adjbox@fam{adjbox} +\DeclareOptionX<Adjbox>{export}{\def\adjbox@fam{Gin}} +\DeclareOptionX<Adjbox>{Export}{\AtEndOfPackage{\let\includegraphics\adjincludegraphics}} +\DeclareOptionX<Adjbox>{patch}{% + \PackageWarning{adjustbox}{% + The 'patch' option is now deprecated.\MessageBreak + Use the new \string\adjustimage\space or \string\adjincludegraphics\space macros instead% + \@gobble + }% +} +\DeclareOptionX<Adjbox>{minimal}{\let\adjustbox@minimal\endinput} +% \end{macrocode} +% +% Declare the options which must be passed to \pkg{adjcalc} in a special form, +% because they require extra packages. This must be this way because \pkg{adjcalc} +% is already loaded. +% \begin{macrocode} +\DeclareOptionX<Adjbox>{pgfmath}{\AtEndOfPackage{\RequirePackage{pgf}\adjcalcset{pgfmath}}} +\DeclareOptionX<Adjbox>{calc}{\AtEndOfPackage{\RequirePackage{calc}\adjcalcset{calc}}} +\DeclareOptionX<Adjbox>{etex}{\AtEndOfPackage{\adjcalcset{etex}}} +\DeclareOptionX<Adjbox>{defaultunit}{\AtEndOfPackage{\adjcalcset{defaultunit={#1}}}} +% \end{macrocode} +% +% Handle the special \opt{pgf} and \opt{PGF} options. +% \begin{macrocode} +\DeclareOptionX<Adjbox>{pgf}{\PassOptionsToPackage{pgf}{trimclip}} +\DeclareOptionX<Adjbox>{PGF}{\PassOptionsToPackage{pgf}{trimclip}\AtEndOfPackage{\RequirePackage{pgf}\adjcalcset{pgfmath}}} +% \end{macrocode} +% +% Pass all driver options to \pkg{trimclip} and all unknown options to \pkg{graphicx}. +% \begin{macrocode} +\DeclareOptionX*{% + \IfFileExists{tc-\CurrentOption.def}{% + \PassOptionsToPackage\CurrentOption{trimclip}% + }{% + \PassOptionsToPackage\CurrentOption{graphicx}% + }% +} +% \end{macrocode} +% +% Process all options. +% \begin{macrocode} +\ProcessOptionsX*<Adjbox>\relax +% \end{macrocode} +% +% Load the required packages. +% \begin{macrocode} +\RequirePackage{trimclip} +\RequirePackage{graphicx}[1999/02/16] +\RequirePackage{collectbox}[2012/05/17] +% \end{macrocode} +% +% Fall-back code for older \pkg{collectbox} versions: +% \begin{macrocode} +\@ifpackagelater{collectbox}{2012/05/17}{}{% + \let\@Collectbox\@collectbox +} +% \end{macrocode} +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Basic commands} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\adjustboxset} +% \begin{macrocode} +\newcommand*\adjustboxset{% + \@ifstar + {\adjbox@addkeysafter}% + {\adjbox@addkeysbefore}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@addkeysbefore}[1]{<keys>} +% \begin{macrocode} +\def\adjbox@addkeysbefore#1{% + \ifx\@nnil#1\@nnil + \let\adjbox@keysbefore\@empty + \else + \expandafter\def\expandafter\adjbox@keysbefore\expandafter{\adjbox@keysbefore,#1}% + \let\adjbox@setkeys\adjbox@setkeys@ba + \fi +} +\let\adjbox@keysbefore\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@addkeysafter}[1]{<keys>} +% \begin{macrocode} +\def\adjbox@addkeysafter#1{% + \begingroup + \def\@tempa{#1}% + \ifx\@tempa\@empty + \endgroup + \let\adjbox@keysafter\@empty + \else + \expandafter\expandafter + \expandafter\endgroup + \expandafter\expandafter + \expandafter\def + \expandafter\expandafter + \expandafter\adjbox@keysafter + \expandafter\expandafter + \expandafter{\expandafter\@tempa\expandafter,\adjbox@keysafter}% + \let\adjbox@setkeys\adjbox@setkeys@ba + \fi +} +\let\adjbox@keysafter\@empty +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\adjustbox}[1]{<keys>} +% Now processes the keys before the box is read to allow for parbox or similar modes. +% +% This code was originally adapted from the \Macro\Gin@ii macro from the |graphicx| package. +% The \emph{temp switch a} is set to |true| to indicate to |graphicx| that the +% scaling should be done internal, so this package doesn't have to do it. +% The content including macro \Macro\adjustbox@content is but into place, +% the saved options are activated and the final size is set. +% The typesetting of the content is finally done by executing the token register. +% \begin{macrocode} +\newcommand\adjustbox{% + \begingroup + \collectboxcheckenv{adjustbox}% + \@adjustbox +} +\long\def\@adjustbox#1{% + \edef\adjbox@line{\the\inputlineno}% + \let\collectbox@mode\relax + \let\collectbox@noindent\relax + \let\adjbox@collectbox\@collectbox + \let\adjbox@begininnercode\@empty + \let\adjbox@endinnercode\@empty + \chardef\adjbox@innerlevel\z@ + \ifcollectboxenv + \let\adjustbox@noindent\noindent + \let\adjustbox@unskip\unskip + \let\adjustbox@ignorespaces\ignorespaces + \else + \let\adjustbox@noindent\relax + \let\adjustbox@unskip\relax + \let\adjustbox@ignorespaces\relax + \fi + \let\XKV@checksanitizea\adjbox@kvsanitize + \adjbox@setkeys{#1}% + \expandafter + \adjbox@collectbox\expandafter{\expandafter\adjustbox@\expandafter{\XKV@rm}}% +} +\def\adjbox@setkeys@ba{% + \expandafter\expandafter + \expandafter\adjbox@@setkeys@ba + \expandafter\expandafter + \expandafter{\expandafter\adjbox@keysbefore\expandafter}% + \expandafter{\adjbox@keysafter}% +} +\def\adjbox@@setkeys@ba#1#2#3{% + \setkeys*{ADJBOX}{#1,#3,#2}% +} +\def\adjbox@setkeys{% + \setkeys*{ADJBOX}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjustbox@}[1]{<keys>} +% Second part of \Macro\adjustbox, after the content has been boxed. +% This sets the dimension macros, processes the keys and finally typesets the content. +% \begin{macrocode} +\def\adjustbox@#1{% + \adjbox@Width\width + \adjbox@Height\height + \adjbox@Depth\depth + \adjbox@Totalheight\totalheight + \let\Width\adjbox@Width + \let\Height\adjbox@Height + \let\Depth\adjbox@Depth + \let\Totalheight\adjbox@Totalheight + \let\Gin@esetsize\adjbox@esetsize + \let\@collectbox\@Collectbox + \@tempswatrue + \toks@{{\adjustbox@content}}% + \def\setlength{\adjsetlength}% + \setkeys{adjbox,Gin,adjcalc}{#1}% + \adjbox@esetsize + \adjustbox@noindent + \the\toks@ + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\begingroup +\catcode`\, 3 +\catcode`\= 3 +\gdef\adjbox@comma@iii{,}% +\gdef\adjbox@equal@iii{=}% +\catcode`\, 4 +\catcode`\= 4 +\gdef\adjbox@comma@iv{,}% +\gdef\adjbox@equal@iv{=}% +\catcode`\, 7 +\catcode`\= 7 +\gdef\adjbox@comma@vii{,}% +\gdef\adjbox@equal@vii{=}% +\catcode`\, 8 +\catcode`\= 8 +\gdef\adjbox@comma@viii{,}% +\gdef\adjbox@equal@viii{=}% +\catcode`\, 10 +\catcode`\= 10 +\gdef\adjbox@comma@x{,}% +\gdef\adjbox@equal@x{=}% +\catcode`\, 11 +\catcode`\= 11 +\gdef\adjbox@comma@xi{,}% +\gdef\adjbox@equal@xi{=}% +\catcode`\, 13 +\catcode`\= 13 +\gdef\adjbox@comma@xiii{,}% +\gdef\adjbox@equal@xiii{=}% +\catcode`\, 12 +\catcode`\= 12 +\gdef\adjbox@comma@xii{,}% +\gdef\adjbox@equal@xii{=}% +% \end{macrocode} +% +% \begin{macro}{\adjbox@kvsanitize} +% \begin{macrocode} +\gdef\adjbox@kvsanitize#1#2{% + \def\@tempa{\expandafter\noexpand\adjbox@comma@xiii}% + \def\@tempb{}% + \ifnum\catcode`\,=12 \else + \ifnum\catcode`\,=13 \else + \@ifundefined{adjbox@comma@\romannumeral\catcode`\,}{% + \PackageError{adjustbox} + {Invalid comma catcode \the\catcode`\,}{}% + }{}% + \edef\@tempb{\csname adjbox@comma@\romannumeral\the\catcode`\,\endcsname}% + \fi + \fi + \edef\@tempa{\@tempa\@tempb}% + \XKV@tempa@toks{#1}% + \expandafter\adjbox@replacecatcodes\expandafter,\@tempa\@nnil + \def\@tempa{\expandafter\noexpand\adjbox@equal@xiii}% + \def\@tempb{}% + \ifnum\catcode`\==12 \else + \ifnum\catcode`\==13 \else + \@ifundefined{adjbox@equal@\romannumeral\catcode`\=}{% + \PackageError{adjustbox} + {Invalid equal sign catcode \the\catcode`\=}{}% + }{}% + \def\@tempb{\@tempa\csname adjbox@equal@\romannumeral\the\catcode`\,\endcsname}% + \fi + \fi + \edef\@tempa{\@tempa\@tempb}% + \expandafter\adjbox@replacecatcodes\expandafter=\@tempa\@nnil + \edef#2{\the\XKV@tempa@toks}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@replacecatcodes} +% \begin{macrocode} +\gdef\adjbox@replacecatcodes#1#2{% + \ifx\@nnil#2\relax\else + \def\@tempa##1#2{% + \ifx\@nnil##1\relax\else + \XKV@tempa@toks{##1}% + \expandafter\@tempb + \fi + }% + \def\@tempb##1#2{% + \ifx\@nnil##1\relax\else + \XKV@tempa@toks\expandafter{\the\XKV@tempa@toks#1##1}% + \expandafter\@tempb + \fi + }% + \expandafter\@tempa\the\XKV@tempa@toks#2\@nnil#2\relax + \expandafter\adjbox@replacecatcodes\expandafter#1% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\endgroup +% \end{macrocode} +% +% +% \begin{macro}{\adjustbox@content} +% The default content, which is simply the collected box. +% This macro can be redefined if required. +% \begin{macrocode} +\def\adjustbox@content{% + \usebox\collectedbox +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\smallestside} +% \begin{macrocode} +\def\smallestside{\ifdim\width<\totalheight \width\else\totalheight\fi}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\largestside} +% \begin{macrocode} +\def\largestside{\ifdim\width>\totalheight \width\else\totalheight\fi}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\Smallestside} +% \begin{macrocode} +\def\Smallestside{\ifdim\Width<\Totalheight \Width\else\Totalheight\fi}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\Largestside} +% \begin{macrocode} +\def\Largestside{\ifdim\Width>\Totalheight \Width\else\Totalheight\fi}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@Width} +% \begin{macro}{\adjbox@Height} +% \begin{macro}{\adjbox@Depth} +% \begin{macro}{\adjbox@Totalheight} +% Dimension registers for original sizes. +% \begin{macrocode} +\newdimen\adjbox@Width +\newdimen\adjbox@Height +\newdimen\adjbox@Depth +\newdimen\adjbox@Totalheight +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\adjbox@pwidth} +% \begin{macro}{\adjbox@pheight} +% \begin{macro}{\adjbox@pdepth} +% \begin{macro}{\adjbox@ptotalheight} +% Dimension registers for parent sizes; used for keys which use an internal adjustbox. +% \begin{macrocode} +\newdimen\adjbox@pwidth +\newdimen\adjbox@pheight +\newdimen\adjbox@pdepth +\newdimen\adjbox@ptotalheight +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\adjbox@parentdims} +% \begin{macrocode} +\def\adjbox@parentdims{% + \let\pwidth\adjbox@pwidth + \let\pheight\adjbox@pheight + \let\pdepth\adjbox@pdepth + \let\ptotalheight\adjbox@ptotalheight + \pwidth\width + \pheight\height + \pdepth\depth + \ptotalheight\totalheight +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@esetsize} +% Replacement of \Macro\Gin@esetsize. +% Now always called in external mode. Checks if any size is set and, as an optimation, does nothing otherwise. +% +% OLD: +% When called in \emph{external} mode (switch is true) then the content is wrapped in +% the internal form of \Macro\resizebox. In \emph{internal} mode, i.e.\ resizing is done by the graphic driver, +% the same code is added around the inner macro. This ensures the same behaviour as \Macro\includegraphics. +% \begin{macrocode} +\def\adjbox@esetsize{% + \ifcase0% + \ifx\Gin@ewidth\Gin@exclamation\else 1\fi + \ifx\Gin@eheight\Gin@exclamation\else 1\fi + \relax + \else + \edef\@tempa{\toks@{\noexpand + \Gscale@@box\noexpand\Gin@eresize + {\Gin@ewidth}{\Gin@eheight}{\the\toks@}}}% + \@tempa + \let\Gin@ewidth\Gin@exclamation + \let\Gin@eheight\Gin@exclamation + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjustimage} +% Simple wrapper to use \Macro\adjustbox for images. +% It uses the internal code of \Macro\includegraphics instead +% to allow later redefinition of that macro. +% \begin{macrocode} +\newcommand*\adjustimage[2]{% + \adjustbox{#1}{\Gin@clipfalse\Gin@i{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjincludegraphics}[2]{<keys>}{<filename>} +% Simple wrapper to use \Macro\adjustbox for images in the same format of \Macro\includegraphics. +% This allows to simply do |\let\includegraphics\adjincludegraphics|, which is done by the \opt{Export} option. +% \begin{macrocode} +\newcommand*\adjincludegraphics[2][]{% + \adjustbox{#1}{\Gin@clipfalse\Gin@i{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% End input of file if the \opt{minimal} option was used. +% \begin{macrocode} +{\csname adjustbox@minimal\endcsname} +% \end{macrocode} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Macros to define new adjustbox environments/macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\newadjustboxenv} +% \begin{macrocode} +\newcommand*\newadjustboxenv{% + \begingroup + \@ifstar{% + \let\@@@newadjustboxenv\@@@newadjustboxenv@ + \def\new@adjustbox{\newenvironment}% + \newadjustboxenv@ + }{% + \def\new@adjustbox{\newcommand}% + \newadjustboxenv@ + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\renewadjustboxenv} +% \begin{macrocode} +\newcommand*\renewadjustboxenv{% + \begingroup + \@ifstar{% + \let\@@@newadjustboxenv\@@@newadjustboxenv@ + \def\new@adjustbox{\renewenvironment}% + \newadjustboxenv@ + }{% + \def\new@adjustbox{\renewcommand}% + \newadjustboxenv@ + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\provideadjustboxenv} +% \begin{macrocode} +\newcommand*\provideadjustboxenv{% + \begingroup + \@ifstar{% + \let\@@@newadjustboxenv\@@@newadjustboxenv@ + \def\new@adjustbox{\@star@or@long\adjustbox@provideenvironment}% + \newadjustboxenv@ + }{% + \def\new@adjustbox{\providecommand}% + \newadjustboxenv@ + }% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\declareadjustboxenv} +% \begin{macrocode} +\newcommand*\declareadjustboxenv{% + \begingroup + \@ifstar{% + \let\@@@newadjustboxenv\@@@newadjustboxenv@ + \def\new@adjustbox##1{% + \expandafter\let\csname ##1\endcsname\@undefined + \newenvironment{##1}% + }% + \newadjustboxenv@ + }{% + \def\new@adjustbox##1{% + \let##1\@undefined + \newcommand{##1}% + }% + \newadjustboxenv@ + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\newadjustboxcmd} +% \begin{macrocode} +\newcommand*\newadjustboxcmd{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustboxcmd + \def\new@adjustbox{\newcommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\renewadjustboxcmd} +% \begin{macrocode} +\newcommand*\renewadjustboxcmd{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustboxcmd + \def\new@adjustbox{\renewcommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\provideadjustboxcmd} +% \begin{macrocode} +\newcommand*\provideadjustboxcmd{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustboxcmd + \def\new@adjustbox{\providecommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\provideadjustboxcmd} +% \begin{macrocode} +\newcommand*\declareadjustboxcmd{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustboxcmd + \def\new@adjustbox##1{\let##1\@undefined\newcommand{##1}}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\adjustbox@provideenvironment}[1]{<environment name>} +% Tests if the environment already exists and calls the internal +% macro of \Macro\newenvironment if not. Otherwise, the two optional +% and two mandatory arguments are gobbled. +% \begin{macrocode} +\def\adjustbox@provideenvironment#1{% + \@ifundefined{#1}% + {\new@environment{#1}}% + {\adjustbox@gobble@oomm}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjustbox@gobble@oomm} +% Gobbles the first optional argument. +% \begin{macrocode} +\newcommand*\adjustbox@gobble@oomm[1][]{% + \adjustbox@gobble@@oomm +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjustbox@gobble@@oomm} +% Gobbles the second optional and two mandatory arguments. +% \begin{macrocode} +\newcommand*\adjustbox@gobble@@oomm[3][]{% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\newadjustboxenv@}[1]{<environment name>} +% \begin{macrocode} +\def\newadjustboxenv@#1{% + \@ifnextchar{[}% + {\@newadjustboxenv{#1}}% + {\@@@newadjustboxenv{#1}{[0]}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@newadjustboxenv}[2]{<environment name>}{<optional argument>} +% \begin{macrocode} +\def\@newadjustboxenv#1[#2]{% + \@ifnextchar{[}% + {\@@newadjustboxenv{#1}{#2}}% + {\@@@newadjustboxenv{#1}{[#2]}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@newadjustboxenv}[3]{<environment name>}{<previous optional argument>}{<optional argument>} +% \begin{macrocode} +\def\@@newadjustboxenv#1#2[#3]{% + \@@@newadjustboxenv{#1}{[#2][#3]}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@@newadjustboxenv@}[3]{<environment name>}{<optional arguments in brackets>}{<keys>} +% \begin{macrocode} +\def\@@@newadjustboxenv@#1#2#3{% + \expandafter + \endgroup + \new@adjustbox{#1}#2{% + \begingroup + \@collectboxisenv{#1}% + \@adjustbox{#3}% + }{% + \collectboxenvend + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@@newadjustboxenv}[3]{<environment name>}{<optional arguments in brackets>}{<keys>} +% \begin{macrocode} +\def\@@@newadjustboxenv#1#2#3{% + \expandafter + \endgroup + \expandafter + \expandafter\new@adjustbox\csname #1\endcsname#2{% + \begingroup + \collectboxcheckenv{#1}% + \@adjustbox{#3}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@@newadjustboxcmd}[3]{<environment name>}{<optional arguments in brackets>}{<keys>} +% \begin{macrocode} +\def\@@@newadjustboxcmd#1#2#3{% + \expandafter + \endgroup + \new@adjustbox{#1}#2{% + \begingroup + \@adjustbox{#3}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newadjustimage} +% \begin{macrocode} +\newcommand*\newadjustimage{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustimage + \def\new@adjustbox{\newcommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\renewadjustimage} +% \begin{macrocode} +\newcommand*\renewadjustimage{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustimage + \def\new@adjustbox{\renewcommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro}% +% +% \begin{macro}{\provideadjustimage} +% \begin{macrocode} +\newcommand*\provideadjustimage{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustimage + \def\new@adjustbox{\providecommand}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\declareadjustimage} +% \begin{macrocode} +\newcommand*\declareadjustimage{% + \begingroup + \let\@@@newadjustboxenv\@@@newadjustimage + \def\new@adjustbox##1{\let##1\@undefined\newcommand{##1}}% + \newadjustboxenv@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@@newadjustimage}[3]{<macro name>}{<optional arguments in brackets>}{<keys>} +% \begin{macrocode} +\def\@@@newadjustimage#1#2#3{% + \expandafter + \endgroup + \new@adjustbox{#1}#2{% + \begingroup + \def\@tempa####1{% + \def\IMAGEFILENAME{####1}% + \@adjustbox{#3}{\Gin@clipfalse\expandafter\Gin@i\expandafter{\IMAGEFILENAME}}% + }% + \@tempa + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\NewAdjustImage} +% \begin{macrocode} +\newcommand*\adjustbox@NewAdjustImage[4]{% + \adjustbox@checkforxparse + #1{#2}{#3}{% + \begingroup + \def\@tempa####1{% + \def\IMAGEFILENAME{####1}% + \@adjustbox{#4}{\Gin@clipfalse\expandafter\Gin@i\expandafter{\IMAGEFILENAME}}% + }% + \@tempa + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\NewAdjustImage} +% \begin{macrocode} +\newcommand*\NewAdjustImage{% + \adjustbox@NewAdjustImage\NewDocumentCommand +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\RenewDocumentCommand} +% \begin{macrocode} +\newcommand*\RenewAdjustImage{% + \adjustbox@NewAdjustImage\RenewDocumentCommand +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ProvideAdjustImage} +% \begin{macrocode} +\newcommand*\ProvideAdjustImage{% + \adjustbox@NewAdjustImage\ProvideDocumentCommand +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareAdjustImage} +% \begin{macrocode} +\newcommand*\DeclareAdjustImage{% + \adjustbox@NewAdjustImage\ProvideDocumentCommand +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\NewAdjustImage} +% \begin{macrocode} +\def\adjustbox@checkforxparse{% + \begingroup + \expandafter\ifx\csname ver@xparse.sty\endcsname\relax + \PackageError{adjustbox}{% + The 'xparse' package must be loaded separately in\MessageBreak + order to use the following macros: \MessageBreak + \string\NewAdjustImage, + \string\RenewAdjustImage, \MessageBreak + \string\ProvideAdjustImage, + \string\DeclareAdjustImage}{} + \fi + \endgroup + \let\adjustbox@checkforxparse\relax +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Internal code adding macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\adjbox@Gin@add}[1]{<code>} +% \begin{macrocode} +\def\adjbox@Gin@add#1{% + \def\@tempa{#1}% + \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}}% +} +\def\adjbox@Gin@Add{% + \Gin@esetsize + \@tempswatrue + \adjbox@Gin@add +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\newadjustboxkey} +% \begin{macrocode} +\newcommand\newadjustboxkey{% + \@adjustboxkey\adjustbox@newkey +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\renewadjustboxkey} +% \begin{macrocode} +\newcommand\renewadjustboxkey{% + \@adjustboxkey\adjustbox@renewkey +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\provideadjustboxkey} +% \begin{macrocode} +\newcommand\provideadjustboxkey{% + \@adjustboxkey\adjustbox@providekey +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\defadjustboxkey} +% \begin{macrocode} +\newcommand\defadjustboxkey{% + \@adjustboxkey\@secondoftwo +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@adjustboxkey}[1]{<key name>} +% \begin{macrocode} +\def\@adjustboxkey#1{% + \@ifstar + {\@adjustboxkey@i#1*}% + {\@adjustboxkey@i#1\relax}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@adjustboxkey@i} +% \begin{macrocode} +\def\@adjustboxkey@i#1#2#3{% + \@ifnextchar{[}% + {\@adjustboxkey@ii#1#2{#3}}% + {\@adjustboxkey@ii#1#2{#3}[\@nnil]}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@adjustboxkey@ii} +% \begin{macrocode} +\def\@adjustboxkey@ii#1#2#3[#4]#5{% + \ifx\@nnil#4\relax + \@adjustboxkey@iii#1#2{#3}{}{#5}% + \else + \@adjustboxkey@iii#1#2{#3}{[#4]}{#5}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@adjustboxkey@iv} +% \begin{macrocode} +\def\@adjustboxkey@iii#1#2#3#4#5{% + #1{#3}{% + \ifx*#2\relax + \define@key\adjbox@fam{#3}#4{#5}% + \else + \define@key\adjbox@fam{#3}#4{% + \adjbox@Gin@Add{\@Collectbox{#5}}% + }% + \fi + }{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\define@adjboxkey} +% \begin{macrocode} +\def\define@adjboxkey#1#2{% + \define@key\adjbox@fam{#1}{% + \adjbox@Gin@Add{#2}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\define@adjboxkey@defvalue} +% \begin{macrocode} +\def\define@adjboxkey@defvalue#1#2#3{% + \define@key\adjbox@fam{#1}[{#2}]{% + \adjbox@Gin@Add{#3}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\define@adjboxkey@novalue} +% \begin{macrocode} +\def\define@adjboxkey@novalue#1#2{% + \define@key\adjbox@fam{#1}[\@nil]{% + \adjbox@novalue{##1}% + \adjbox@Gin@Add{#2}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@novalue} +% \begin{macrocode} +\def\adjbox@novalue#1{% + \ifx\@nil#1\else + \PackageWarning{adjustbox}{% + Key '\XKV@tkey' does not await a value.\MessageBreak + Given value will be ignored% + }% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjustbox@newkey} +% \begin{macrocode} +\def\adjustbox@newkey#1#2{% + \@ifundefined{KV@\adjbox@fam @#1}{#2}{% + \PackageError{adjustbox}{Key '#1' already defined}{}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjustbox@renewkey} +% \begin{macrocode} +\def\adjustbox@renewkey#1{% + \@ifundefined{KV@\adjbox@fam @#1}{% + \PackageError{adjustbox}{Key '#1' undefined}{}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjustbox@providekey} +% \begin{macrocode} +\def\adjustbox@providekey#1#2{% + \@ifundefined{KV@\adjbox@fam @#1}{#2}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\adjbox@let@key} +% Aliases one key to another. +% \begin{macrocode} +\def\adjbox@let@key#1#2#3{% + \expandafter\let\csname KV@#1@#2\expandafter\endcsname\csname KV@#1@#3\endcsname + \expandafter\let\csname KV@#1@#2@default\expandafter\endcsname\csname KV@#1@#3@default\endcsname +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@copy@key} +% Aliases one key to another. +% \begin{macrocode} +\def\adjbox@copy@key#1{% + \expandafter\let + \csname KV@ADJBOX@#1\expandafter\endcsname + \csname KV@Gin@#1\endcsname + \expandafter\let + \csname KV@ADJBOX@#1@default\expandafter\endcsname + \csname KV@Gin@#1@default\endcsname +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Keys for trimming, clipping, viewport and margin} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{key}{adjbox}{viewport} +% \begin{macrocode} +\define@key{adjbox}{viewport}{% + \def\adjustbox@content{% + \@trimclip{% + \ifGin@clip + \expandafter\@clipvpbox + \else + \expandafter\@viewportbox + \fi + }{#1}% + }% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{Viewport} +% \begin{macrocode} +\define@adjboxkey{Viewport}{\trimbox@s{#1}}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{trim} +% \begin{macrocode} +\define@key{adjbox}{trim}{% + \def\adjustbox@content{% + \@trimclip{% + \ifGin@clip + \expandafter\@clipbox + \else + \expandafter\@trimbox + \fi + }{#1}% + }% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{Trim} +% \begin{macrocode} +\define@adjboxkey{Trim}{\trimbox@{#1}}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{Clip} +% \begin{macrocode} +\define@adjboxkey{Clip}{\clipbox@{#1}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{rndcorners} +% \begin{macrocode} +\define@adjboxkey{rndcorners}{\rndcornersbox@{#1}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{rndframe} +% \begin{macrocode} +\define@adjboxkey{rndframe}{% + \@ifnextchar\bgroup{% + \adjbox@rndframe{sep=\z@}% + }{% + \adjbox@rndframe{sep=\z@}{}% + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{rndfbox} +% \begin{macrocode} +\define@adjboxkey{rndfbox}{% + \@ifnextchar\bgroup{% + \adjbox@rndframe{}% + }{% + \adjbox@rndframe{}{}% + }#1\@nnil +} + +\def\adjbox@rndframe#1#2#3\@nnil{% + \rndfbox[{#1,#2}]{#3}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{Clip*} +% \begin{macrocode} +\define@adjboxkey{Clip*}{\clipbox@s{#1}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{margin} +% \begin{macrocode} +\define@adjboxkey{margin}{\marginbox@{#1}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{margin*} +% \begin{macrocode} +\define@adjboxkey{margin*}{\marginbox@s{#1}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{padding} +% Alias for \Key{margin}. +% \begin{macrocode} +\adjbox@let@key\adjbox@fam{padding}{margin} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{padding*} +% Alias for \Key{margin*}. +% \begin{macrocode} +\adjbox@let@key\adjbox@fam{padding*}{margin*} +% \end{macrocode} +% \end{key} +% +% +% \begin{macrocode} +\adjbox@copy@key{bbllx} +\adjbox@copy@key{bblly} +\adjbox@copy@key{bburx} +\adjbox@copy@key{bbury} +\adjbox@copy@key{decodearray} +\adjbox@copy@key{intent} +\adjbox@copy@key{interpolate} +\adjbox@copy@key{maskarray} +\adjbox@copy@key{natheight} +\adjbox@copy@key{natwidth} +\adjbox@copy@key{ocobjnum} +\adjbox@copy@key{ocobjref} +\adjbox@copy@key{page} +\adjbox@copy@key{pagebox} +\adjbox@copy@key{print} +\adjbox@copy@key{quiet} +\adjbox@copy@key{resetcolor} +\adjbox@copy@key{resolution} +\adjbox@copy@key{xmpfile} +% \end{macrocode} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Round corners} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\rndcornersbox} +% \begin{macrocode} +\newcommand\rndcornersbox{% + \collectboxcheckenv{rndcornersbox}% + \rndcornersbox@ +} +\def\rndcornersbox@#1{% + \collectbox{\@trimclip\@clipcornersofbox{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rndframebox} +% \begin{macrocode} +\newcommand\rndframebox{% + \collectboxcheckenv{rndframebox}% + \rndframebox@ +} +\newcommand*\rndframebox@[2][]{% + \collectbox{\@trimclip{\rndframearoundbox@{sep=\z@,#1}}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rndfbox} +% \begin{macrocode} +\newcommand\rndfbox{% + \collectboxcheckenv{rndfbox}% + \rndfbox@ +} +\newcommand*\rndfbox@[2][]{% + \collectbox{\@trimclip{\rndframearoundbox@{#1}}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\rndframearoundbox@} +% \begin{macrocode} +\newif\ifadjbox@rndframe@clip +\def\rndframearoundbox@#1#2#3#4#5#6{% + \setkeys{adjbox@rndframe}{#1}% + \@rndframearoundbox{#2}{#3}{#4}{#5}{#6}{\ifadjbox@rndframe@clip\relax\fi}% +} +\define@key{adjbox@rndframe}{width}{% + \adjsetlength\fboxrule{#1}% +} +\define@key{adjbox@rndframe}{sep}{% + \adjsetlength\fboxsep{#1}% +} +\define@key{adjbox@rndframe}{color}{% + \def\adjbox@rndframe@color{\color{#1}}% +} +\define@key{adjbox@rndframe}{color*}{% + \def\adjbox@rndframe@color{#1}% +} +\let\adjbox@rndframe@color\relax +\define@key{adjbox@rndframe}{clip}[true]{% + \csname adjbox@rndframe@clip#1\endcsname +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +% \DescribeKey{color}'='{<color>} +% \DescribeKey{color*}'='{<color command>} +% \DescribeKey{width}'='{<rule width>} +% \DescribeKey{sep}'='{<rule separation>} +% \end{macrocode} +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Scaling and rotating keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{scale} +% \begin{macrocode} +\define@key\adjbox@fam{scale}{% + \@ifnextchar\bgroup{% + \adjbox@scale@xy + }{% + \adjbox@scale@x + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@scale@x} +% \begin{macrocode} +\def\adjbox@scale@x#1\@nnil{% + \adjbox@scale@xy{#1}{#1}\@nnil% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@scale@xy} +% \begin{macrocode} +\def\adjbox@scale@xy#1#2\@nnil{% + \if@tempswa + \adjbox@Gin@add{\Gscale@box{#1}[{#2}]}% + \else + \def\Gin@req@sizes{% + \def\Gin@scalex{#1}\def\Gin@scaley{#2}% + \Gin@req@height\Gin@scaley\Gin@nat@height + \Gin@req@width\Gin@scalex\Gin@nat@width}% + \fi + \@tempswatrue +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{reflect} +% Taken from the \Key{scale} key of the \pkg{graphicx} package. +% Open question: why is \Macro\Gin@esetsize not called? +% \begin{macrocode} +\define@key\adjbox@fam{reflect}[]{% + \adjbox@scale@xy{-1}{1}\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{rotate} +% New alias of existing |angle| key. +% \begin{macrocode} +\expandafter\let\csname KV@\adjbox@fam @rotate\endcsname\KV@Gin@angle +% \end{macrocode} +% \end{key} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Horizontal alignment keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{macro}{\adjbox@halign}[3]{<official width>}{<aligner left>}{<aligner right>} +% \begin{macrocode} +\def\adjbox@halign#1#2#3{% + \@collectbox{\@adjbox@halign{#1}{#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@adjbox@halign}[3]{<official width>}{<aligner left>}{<aligner right>} +% \begin{macrocode} +\def\@adjbox@halign#1#2#3{% + \begingroup + \adjsetlength\@tempdima{#1}% + \leavevmode\hb@xt@\the\@tempdima{#2\BOXCONTENT#3}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{key}{adjbox}{center}[1]{<official width>} +% \begin{macrocode} +\define@adjboxkey@defvalue{center}{\linewidth}{\adjbox@halign{#1}\hss\hss} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{left}[1]{<official width>} +% \begin{macrocode} +\define@adjboxkey@defvalue{left}{\linewidth}{\adjbox@halign{#1}\relax\hss} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{right}[1]{<official width>} +% \begin{macrocode} +\define@adjboxkey@defvalue{right}{\linewidth}{\adjbox@halign{#1}\hss\relax} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\centerbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\centerbox[1][\linewidth]{% + \collectboxcheckenv{centerbox}% + \noindent + \adjbox@halign{#1}\hss\hss +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\leftalignbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\leftalignbox[1][\linewidth]{% + \collectboxcheckenv{leftalignbox}% + \noindent + \adjbox@halign{#1}\relax\hss +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\rightalignbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\rightalignbox[1][\linewidth]{% + \collectboxcheckenv{rightalignbox}% + \noindent + \adjbox@halign{#1}\hss\relax +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{outer}[1]{<official width>} +% \begin{macrocode} +\define@adjboxkey@defvalue{outer}{\linewidth}{% + \outersidebox[{#1}]% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{inner}[1]{<official width>} +% \begin{macrocode} +\define@adjboxkey@defvalue{inner}{\linewidth}{% + \innersidebox[{#1}]% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\outersidebox}[1]{<official width>} +% \begin{macrocode} +\newcommand\outersidebox[1][\linewidth]{% + \collectboxcheckenv{outersidebox}% + \noindent + \adjbox@halign{#1}{% + \checkoddpage + \ifoddpageoroneside + \hss + \else + \relax + \fi + }{% + \ifoddpageoroneside + \relax + \else + \hss + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\innersidebox}[1]{<official width>} +% \begin{macrocode} +\newcommand\innersidebox[1][\linewidth]{% + \collectboxcheckenv{innersidebox}% + \noindent + \adjbox@halign{#1}{% + \checkoddpage + \ifoddpageoroneside + \relax + \else + \hss + \fi + }{% + \ifoddpageoroneside + \hss + \else + \relax + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{pagecenter}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{pagecenter}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\pagecenterbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{pageleftalign}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{pageleftalign}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\pageleftalignbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{pagerightalign}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{pagerightalign}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\pagerightalignbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{pageinner}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{pageinner}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\pageinnerbox[{#1}]}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{pageouter}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{pageouter}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\pageouterbox[{#1}]}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{textareacenter}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{textareacenter}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\textareacenterbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{textarealeftalign}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{textarealeftalign}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\textarealeftalignbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{textarearightalign}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{textarearightalign}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\textarearightalignbox[{#1}]}% +}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{textareainner}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{textareainner}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\textareainnerbox[{#1}]}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{textareaouter}[1]{<official width>} +% \begin{macrocode} +\define@key\adjbox@fam{textareaouter}[\linewidth]{% + \noindent\leavevmode + \adjbox@Gin@Add{\textareaouterbox[{#1}]}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\pagecenterbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\pagecenterbox[1][\linewidth]{% + \collectboxcheckenv{pagecenterbox}% + \noindent\leavevmode\checkoddpage + \@collectbox{\@pagecenterbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi+.5\paperwidth-.5\@tempdimc-\@totalleftmargin}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@pagecenterbox}[2]{<official width>}{<lap amount>} +% \begin{macrocode} +\def\@pagecenterbox#1#2{% + \adjsetlength\@tempdimc{#1}% + \ifdim\@tempdimc<\z@ + \@tempdimc=\z@ + \fi + \adjsetlength\@tempdima{#2}% + \ifdim\@tempdima<\z@ + \@tempdimb=-\@tempdima + \else + \@tempdimb=\@tempdima + \fi + \ifdim\@tempdima<\z@ + \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdimb{\hb@xt@\@tempdimc{\hss\usebox\collectedbox\hss}\hss}\hskip\@tempdimc}% + \else + \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdimb{\hss\hb@xt@\@tempdimc{\hss\usebox\collectedbox\hss}}\hss}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\textareacenterbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\textareacenterbox[1][\linewidth]{% + \collectboxcheckenv{textareacenterbox}% + \noindent\leavevmode + \@collectbox{\@pagecenterbox{#1}{-\@totalleftmargin+.5\textwidth-.5\linewidth}}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\pageleftalignbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\pageleftalignbox[1][\linewidth]{% + \collectboxcheckenv{pageleftalignbox}% + \noindent\leavevmode\checkoddpage + \@collectbox{\@lapbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi-\@totalleftmargin}}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\pagerightalignbox}[1]{<official width>} +% Note: \Macro\@tempdimc holds the official width inside \Macro\@lapbox. +% \begin{macrocode} +\newcommand\pagerightalignbox[1][\linewidth]{% + \collectboxcheckenv{pagerightalignbox}% + \noindent\leavevmode\checkoddpage + \@collectbox{\@lapbox{#1}{-1in-\hoffset-\ifoddpage\oddsidemargin\else\evensidemargin\fi-\@totalleftmargin+\paperwidth-(#1)}}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\textarealeftalignbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\textarealeftalignbox[1][\linewidth]{% + \collectboxcheckenv{textarealeftalignbox}% + \noindent\leavevmode\checkoddpage + \@collectbox{\@textarealeftalignbox{#1}}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\@textarealeftalignbox}[1]{<official width>} +% \begin{macrocode} +\def\@textarealeftalignbox#1{% + \adjsetlength\@tempdima{\@totalleftmargin}% + \adjsetlength\@tempdimc{#1}% + \ifdim\@tempdimc<\z@ + \@tempdimc=\z@ + \fi + \leavevmode + \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdima{\usebox\collectedbox\hss}\hskip\@tempdimc}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\textarearightalignbox}[1]{<official width>} +% \begin{macrocode} +\newcommand\textarearightalignbox[1][\linewidth]{% + \collectboxcheckenv{textarearightalignbox}% + \noindent\leavevmode\checkoddpage + \@collectbox{\@textarearightalignbox{#1}{+\textwidth}}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{\@textarearightalignbox}[1]{<official width>} +% \begin{macrocode} +\def\@textarearightalignbox#1#2{% + \adjsetlength\@tempdimc{#1}% + \ifdim\@tempdimc<\z@ + \@tempdimc=\z@ + \fi + \adjsetlength\@tempdima{-\@totalleftmargin+\textwidth-\@tempdimc}% + \ifdim\@tempdima<\z@ + \@tempdima=-\@tempdima + \fi + \leavevmode + \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdima{\hss\usebox\collectedbox}\hss}% +} +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macro}{pageinnerbox} +% \begin{macrocode} +\newcommand\pageinnerbox{% + \noindent\leavevmode\checkoddpage + \ifoddpageoroneside + \expandafter\pageleftalignbox + \else + \expandafter\pagerightalignbox + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{pageouterbox} +% \begin{macrocode} +\newcommand\pageouterbox{% + \noindent\leavevmode\checkoddpage + \ifoddpageoroneside + \expandafter\pagerightalignbox + \else + \expandafter\pageleftalignbox + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{textareaouterbox} +% \begin{macrocode} +\newcommand\textareainnerbox{% + \noindent\leavevmode\checkoddpage + \ifoddpageoroneside + \expandafter\textarealeftalignbox + \else + \expandafter\textarearightalignbox + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{textareaouterbox} +% \begin{macrocode} +\newcommand\textareaouterbox{% + \noindent\leavevmode\checkoddpage + \ifoddpageoroneside + \expandafter\textarearightalignbox + \else + \expandafter\textarealeftalignbox + \fi +}% +% \end{macrocode} +% \end{macro}% +% +% +% \begin{macrocode} +\IfFileExists{ifoddpage.sty}{% + \RequirePackage{ifoddpage}% +}{% + \def\checkoddpage{% + \PackageError{adjustbox}{% + The used key, macro or environment requires \MessageBreak + the 'ifoddpage' package which is not installed!}{}% + } +}% +% \end{macrocode} +% +% +% \begin{key}{adjbox}{noindent} +% \begin{macrocode} +\define@key\adjbox@fam{noindent}[]{% + \noindent +} +% \end{macrocode} +% \end{key}% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Vertical alignment keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{raise} +% \begin{macrocode} +\define@key\adjbox@fam{raise}{% + \@ifnextchar\bgroup{% + \adjbox@raise + }{% + \adjbox@raise{#1}{}{}% + }#1{}{}{}\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@raise} +% \begin{macrocode} +\def\adjbox@raise#1#2#3#4\@nnil{% + \adjbox@Gin@Add{\adjbox@raisebox{#1}{#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@raisebox}[3]{raise amount}{height}{depth} +% \begin{macrocode} +\def\adjbox@raisebox#1#2#3{% + \@collectbox{\adjbox@@raisebox{#1}{#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@@raisebox}[3]{raise amount}{height}{depth} +% \begin{macrocode} +\def\adjbox@@raisebox#1#2#3{% + \ifx\@nnil#1\@nnil + \setbox\@tempboxa\copy\collectedbox + \else + \adjsetlength\@tempdima{#1}% + \setbox\@tempboxa\hbox{\raise\@tempdima\copy\collectedbox}% + \fi + \ifx\@nnil#2\@nnil\else + \adjsetlength\@tempdima{#2}% + \ht\@tempboxa\@tempdima + \fi + \ifx\@nnil#3\@nnil\else + \adjsetlength\@tempdima{#3}% + \dp\@tempboxa\@tempdima + \fi + \leavevmode + \box\@tempboxa +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{valign} +% \begin{macrocode} +\define@key\adjbox@fam{valign}{% + \expandafter\adjbox@Gin@Add\expandafter{\csname adjbox@valign@#1\endcsname}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjboxvtop} +% \begin{macrocode} +\def\adjboxvtop{\ht\strutbox} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\adjboxvcenter} +% \begin{macrocode} +\def\adjboxvcenter{1ex} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\adjboxvbottom} +% \begin{macrocode} +\def\adjboxvbottom{-\dp\strutbox} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@t} +% \begin{macrocode} +\def\adjbox@valign@t{% + \adjbox@raisebox{-\height+\adjboxvtop}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@T} +% \begin{macrocode} +\def\adjbox@valign@T{% + \adjbox@raisebox{-\height}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@M} +% \begin{macrocode} +\def\adjbox@valign@M{% + \adjbox@raisebox{.5\depth-.5\height}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@m} +% \begin{macrocode} +\def\adjbox@valign@m{% + \adjbox@raisebox{.5\depth-.5\height+\adjboxvcenter}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@c} +% \begin{macrocode} +\def\adjbox@valign@c#1{% + \leavevmode + \hbox{% + $\vcenter{\hbox{#1}}\m@th$% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@b} +% \begin{macrocode} +\def\adjbox@valign@b{% + \adjbox@raisebox{\depth+\adjboxvbottom}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@valign@B} +% \begin{macrocode} +\def\adjbox@valign@B{% + \adjbox@raisebox{\depth}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Set vertical sizes} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{set height} +% \begin{macrocode} +\define@adjboxkey{set height}{\adjbox@raisebox{}{#1}{}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{set depth} +% \begin{macrocode} +\define@adjboxkey{set depth}{\adjbox@raisebox{}{}{#1}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{set vsize} +% Uses the same code like \Key{raise} but with the raise value of 0pt, +% i.e.\ only sets the height and depth. +% \begin{macrocode} +\define@adjboxkey{set vsize}{\adjbox@raisebox{}#1} +% \end{macrocode} +% \end{key} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Vertical spacing} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{vspace} +% \begin{macrocode} +\define@key\adjbox@fam{vspace}{% + \adjbox@vskip#1 {} \@nnil{}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{vspace*} +% \begin{macrocode} +\define@key\adjbox@fam{vspace*}{% + \adjbox@vskip#1 {} \@nnil*% +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@vskip} +% \begin{macrocode} +\def\adjbox@vskip#1 #2 #3\@nnil#4{% + \ifx\@nnil#2\@nnil + \adjust@addcode{\par\vspace#4{#1}\noindent}{\par\vspace#4{#1}}% + \else + \adjust@addcode{\par\vspace#4{#1}\noindent}{\par\vspace#4{#2}}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Minimum and maximum size keys and macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{min width} +% \begin{macrocode} +\define@adjboxkey{min width}{\@minsizebox\height{#1}!} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{max width} +% \begin{macrocode} +\define@adjboxkey{max width}{\@maxsizebox\height{#1}!} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{min height} +% \begin{macrocode} +\define@adjboxkey{min height}{\@minsizebox\height!{#1}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{max height} +% \begin{macrocode} +\define@adjboxkey{max height}{\@maxsizebox\height!{#1}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{min totalheight} +% \begin{macrocode} +\define@adjboxkey{min totalheight}{\@minsizebox\totalheight!{#1}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{max totalheight} +% \begin{macrocode} +\define@adjboxkey{max totalheight}{\@maxsizebox\totalheight!{#1}} +% \end{macrocode} +% \end{key} +% +% +% +% \begin{macro}{\adjbox@Gin@sizeadd} +% Checks if key-value is actually two arguments. If not it is doubled. +% E.g.: \verb+min size=\A+ is the same as \verb+min size={\A}{\A}+ +% \begin{macrocode} +\def\adjbox@Gin@sizeadd#1#2\@nnil{% + \@ifnextchar\bgroup{% + \adjbox@Gin@Add{#1#2}% + \remove@to@nnil + }{% + \adjbox@Gin@Add{#1{#2}{#2}}% + \remove@to@nnil + }#2\@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{min size} +% \begin{macrocode} +\define@key\adjbox@fam{min size}{% + \adjbox@Gin@sizeadd{\@minsizebox\height}#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{max size} +% \begin{macrocode} +\define@key\adjbox@fam{max size}{% + \adjbox@Gin@sizeadd{\@maxsizebox\height}#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{min totalsize} +% \begin{macrocode} +\define@key\adjbox@fam{min totalsize}{% + \adjbox@Gin@sizeadd{\@minsizebox\totalheight}#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{max totalsize} +% \begin{macrocode} +\define@key\adjbox@fam{max totalsize}{% + \adjbox@Gin@sizeadd{\@maxsizebox\totalheight}#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{warn width} +% \begin{macrocode} +\define@adjboxkey@defvalue{warn width}{\linewidth}{\@Collectbox{\adjbox@warnwidth{#1}}} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@warnwidth} +% Warn if width is wider than the given width plus |\hfuzz|. +% \begin{macrocode} +\def\adjbox@warnwidth#1{% + \@tempdima=#1\relax + \advance\@tempdima by -\width + \@tempdima=-\@tempdima + \ifdim\@tempdima>\hfuzz + \typeout{Overfull \string\hbox\space (\the\@tempdima\space too wide) in adjustbox at + \ifnum\adjbox@line=\inputlineno + line \adjbox@line + \else + lines \adjbox@line--\the\inputlineno + \fi + }% + \fi + \BOXCONTENT +} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\minsizebox} +% \begin{macrocode} +\newcommand*\minsizebox{% + \collectboxcheckenv{minsizebox}% + \@ifstar{\@minsizebox\totalheight}{\@minsizebox\height}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{minsizebox*} +% \begin{macrocode} +\expandafter\newcommand\expandafter*\csname minsizebox*\endcsname{% + \@collectboxisenv{minsizebox*}% + \@minsizebox\totalheight +} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\@minsizebox} +% \begin{macrocode} +\newcommand*\@minsizebox[3]{% + \@collectbox{\@minmaxsizebox>#1{#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\maxsizebox} +% \begin{macrocode} +\newcommand*\maxsizebox{% + \collectboxcheckenv{maxsizebox}% + \@ifstar{\@maxsizebox\totalheight}{\@maxsizebox\height}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{maxsizebox*} +% \begin{macrocode} +\expandafter\newcommand\expandafter*\csname maxsizebox*\endcsname{% + \@collectboxisenv{maxsizebox*}% + \@maxsizebox\totalheight +} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\@maxsizebox} +% \begin{macrocode} +\newcommand*\@maxsizebox[3]{% + \@collectbox{\@minmaxsizebox<#1{#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@minmaxsizebox}[4]{Compare sign \texttt{<} or \texttt{>}}{\cs{height} or \cs{totalheight}}{width}{height} +% Used for all min/max-size boxes including the starred version. The first two arguments determine the style. +% +% The width and height values are expanded to allow for \Macro\ifdim or similar conditionals. +% \begin{macrocode} +\newcommand*\@minmaxsizebox[4]{% + \edef\@tempa{#3}% + \edef\@tempb{#4}% + \ifx\@tempa\Gin@exclamation\else + \adjsetlength\@tempdima{#3}% + \fi + \ifx\@tempb\Gin@exclamation\else + \adjsetlength\@tempdimb{#4}% + \fi + \ifcase0% +% \end{macrocode} +% Do nothing if both values are `|!|', otherwise use case 1 if the height is to large/small (|#1|) +% than the \Macro\height or \Macro\totalheight (|#2|). +% \begin{macrocode} + \ifx\@tempa\Gin@exclamation + \ifx\@tempb\Gin@exclamation + \else + \ifdim\@tempdimb#1#2% + 1% + \fi + \fi + \else +% \end{macrocode} +% If the width is given, but not the height, use case 2 if the width is to large/small (|#1|) than the native \Macro\width. +% \begin{macrocode} + \ifx\@tempb\Gin@exclamation + \ifdim\@tempdima#1\width + 2% + \fi + \else +% \end{macrocode} +% If both values are given. +% Use case 0-3 depending if the width and/or height is to large/small. +% \begin{macrocode} + \ifdim\@tempdima#1\width + \ifdim\@tempdimb#1#2% + 3% + \else + 2% + \fi + \else + \ifdim\@tempdimb#1#2% + 1% + \fi + \fi + \fi + \fi +% \end{macrocode} +% Case 0: no scaling is needed. Insert content unchanged. +% \begin{macrocode} + \relax% 0 + \BOXCONTENT +% \end{macrocode} +% Case 1: height needs scaling. Calculate factor and scale the content with it. +% \begin{macrocode} + \or + \Gscale@div\@tempa\@tempdimb#2% + \Gscale@box\@tempa[\@tempa]\BOXCONTENT +% \end{macrocode} +% Case 2: width needs scaling. Calculate factor and scale the content with it. +% \begin{macrocode} + \or + \Gscale@div\@tempa\@tempdima\width + \Gscale@box\@tempa[\@tempa]\BOXCONTENT +% \end{macrocode} +% Case 3: both width and height need scaling. +% Both scale factors are calculated and the more extreme value is used. +% \begin{macrocode} + \or + \Gscale@div\@tempa\@tempdima\width + \Gscale@div\@tempb\@tempdimb#2% + \ifdim\@tempa\p@#1\@tempb\p@ + \let\@tempb\@tempa + \else + \let\@tempa\@tempb + \fi + \Gscale@box\@tempa[\@tempb]\BOXCONTENT + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Frame keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{key}{adjbox}{frame} +% As 0--3 arguments: rule width, (inner) separation and margin. +% \begin{macrocode} +\define@key\adjbox@fam{frame}[{{\fboxrule}}]{% + \adjbox@frame{\fboxsep\z@}#1 {} {} \relax\relax\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{fbox} +% Same as \Key{frame} but with different default separation. +% \begin{macrocode} +\define@key\adjbox@fam{fbox}[{{\fboxrule}}]{% + \adjbox@frame{}#1 {} {} {} \relax\relax\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@frame} +% \begin{macrocode} +\def\adjbox@frame#1#2 #3 #4 #5\relax{% + \adjbox@Gin@Add{% + \@Collectbox{#1\adjbox@@frame{}{#2}{#3}{#4}}% + }% + \remove@to@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{cframe} +% \begin{macrocode} +\define@key\adjbox@fam{cframe}{% + \adjbox@checkcolor + \adjbox@cframe{\fboxsep\z@}#1 {} {} {} \relax\relax\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{cfbox} +% \begin{macrocode} +\define@key\adjbox@fam{cfbox}{% + \adjbox@checkcolor + \adjbox@cframe{}#1 {} {} {} \relax\relax\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@cframe} +% \begin{macrocode} +\def\adjbox@cframe#1#2 #3 #4 #5 #6\relax{% + \adjbox@Gin@Add{% + \@Collectbox{#1\adjbox@@frame{\color{#2}}{#3}{#4}{#5}}% + }% + \remove@to@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@checkcolor} +% \begin{macrocode} +\def\adjbox@checkcolor{% + \ifcase0% + \expandafter\ifx\csname ver@xcolor.sty\endcsname\relax + \expandafter\ifx\csname ver@color.sty\endcsname\relax + \expandafter\ifx\csname ver@xxcolor.sty\endcsname\relax 1\fi\fi\fi + \relax + \global\let\adjbox@checkcolor\relax + \else + \PackageError{adjustbox}{Using a macro, environment or key with color\MessageBreak + requires a color package to be loaded manually.\MessageBreak + Recommended is 'xcolor' but 'color' is ok, too}{}. + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@@frame}[4]{content}{rule width}{separation}{margin} +% \begin{macrocode} +\def\adjbox@@frame#1#2#3#4{% + \ifx\@nnil#2\@nnil\else + \adjsetlength\fboxrule{#2}% + \fi + \ifx\@nnil#3\@nnil\else + \adjsetlength\fboxsep{#3}% + \fi + \adjsetlength\tc@llx{\fboxrule + \fboxsep}% + \@marginbox\collectedbox\tc@llx\tc@llx\tc@llx\tc@llx + \ifx\@nnil#4\@nnil\else + \setbox\collectedbox + \fi + \hbox\bgroup\color@setgroup + \BOXCONTENT + \hskip-\width + #1% + \adjbox@boxframe\width\height\depth + \color@endgroup\egroup + \ifx\@nnil#4\@nnil\else + \adjsetlength\tc@llx{#4}% + \@marginbox\collectedbox\tc@llx\tc@llx\tc@llx\tc@llx + \BOXCONTENT + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@boxframe}[3]{width}{height}{depth} +% Tries to reuse the definition of the \pkg{xcolor} package. +% If it isn't loaded its definition is defined here. +% +% This code was taken from the \pkg{xcolor} package under the free LPPL license. +% \begin{macrocode} +\let\adjbox@boxframe\boxframe +\providecommand\adjbox@boxframe[3]{% + \hbox{% + \dimen@ #2% + \advance \dimen@ #3\relax + \lower #3\vbox {% + \hrule \@height \fboxrule + \@tempdima -0.5\fboxrule + \ifodd\fboxrule + \advance \@tempdima \m@ne sp + \fi + \kern \@tempdima + \hbox {% + \advance \dimen@ -\fboxrule + \vrule \@width \fboxrule \@height \dimen@ \@depth \z@ + \@tempdima #1% + \advance \@tempdima -\tw@ \fboxrule + \kern \@tempdima + \vrule \@width \fboxrule \@height \dimen@ \@depth \z@ + }% + \kern -0.5\fboxrule + \hrule \@height \fboxrule + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Density keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{dpi} +% \begin{macrocode} +\define@key\adjbox@fam{dpi}{% + \adjsetlength\pdfpxdimen{1in/(#1)}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{pxdim} +% \begin{macrocode} +\define@key\adjbox@fam{pxdim}{% + \adjsetlength\pdfpxdimen{#1}% +} +% \end{macrocode} +% \end{key} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Code keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macrocode} +\define@key\adjbox@fam{execute}{% + #1% +} +% \end{macrocode} +% +% \begin{macrocode} +\define@key\adjbox@fam{@debug}[]{% + \showthe\toks@ +} +% \end{macrocode} +% +% \begin{macrocode} +\define@key{ADJBOX}{Execute}{% + #1% +} +% \end{macrocode} +% +% +% \begin{key}{adjbox}{addcode} +% Adds code before and after the current boxed content. +% Syntax:~\Key{addcode}'='{<code before>}{<code afterwards>} +% \begin{macrocode} +\define@key{adjbox}{Addcode}{% + \adjust@@addcode#1{}\@nnil% +} +\define@key{adjbox}{addcode}{% + \Gin@esetsize + \@tempswatrue + \adjust@@addcode#1{}\@nnil% +} +\long\def\adjust@@addcode#1#2#3\@nnil{% + \ifx\@nnil#3\@nnil + \adjust@addcode{#1}{#2}% + \else + \PackageError{adjustbox}{Incorrect input for key 'addcode={<code before>}{<code afterwards>}'!}% + \fi +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{precode} +% \begin{macrocode} +\define@key{adjbox}{precode}{% + \Gin@esetsize + \@tempswatrue + \adjust@addcode{#1}{}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{Precode} +% Same as \Key{precode} but does not set the size yet. +% \begin{macrocode} +\define@key{adjbox}{Precode}{% + \adjust@addcode{#1}{}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{appcode} +% \begin{macrocode} +\define@key{adjbox}{appcode}{% + \toks@\expandafter{\the\toks@#1}% +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjust@addcode} +% \begin{macrocode} +\long\def\adjust@addcode#1#2{% + \def\@tempa{#1}% + \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\expandafter{\the\toks@}#2}% +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{env} +% Adds environment around boxed content +% \begin{macrocode} +\define@key\adjbox@fam{env}{% + \@ifnextchar\bgroup{% + \adjbox@addenv + }{% + \adjbox@addenv{#1}\@nnil% + \remove@to@nnil + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjust@addenv} +% \begin{macrocode} +\def\adjbox@addenv#1#2\@nnil{% + \def\@tempa{\begin{#1}#2}% + \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa\the\toks@\end{#1}}% +}% +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Background keys and macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{ADJBOX}{color} +% Sets the foreground color, i.e.\ the color used for the content. +% |#1| are the argument to color, i.e. either \MacroArgs<color> +% or \MacroArgs{<model>}{<color>}. +% \begin{macrocode} +\define@key{ADJBOX}{color}{% + \adjbox@checkcolor + \@ifnextchar\bgroup{% + \adjbox@color + }{% + \adjbox@color{}{#1}% + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@color} +% Check for the optional color argument. +% \begin{macrocode} +\def\adjbox@color#1#2#3\@nnil{% + \ifx\@nnil#1\@nnil + \color{#2}% + \else + \color[{#1}]{#2}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{key}{ADJBOX}{color*} +% Sets the color using a given color command. +% \begin{macrocode} +\define@key{ADJBOX}{color*}{% + #1% +} +% \end{macrocode} +% \end{key} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{fgcolor} +% Changes the foreground color. +% |#1| are the argument to color, i.e. either \MacroArgs<color> +% or \MacroArgs{<model>}{<color>}. +% \begin{macrocode} +\define@key{ADJBOX}{fgcolor}{% + \adjbox@checkcolor + \@ifnextchar\bgroup{% + \adjbox@fgcolor + }{% + \adjbox@fgcolor{}{#1}% + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@fgcolor} +% Parses the two possible arguments and adds the color macro +% to the token register. +% \begin{macrocode} +\def\adjbox@fgcolor#1#2#3\@nnil{% + \ifx\@nnil#1\@nnil + \adjbox@innercode{\color{#2}}{}% + \else + \adjbox@innercode{\color[{#1}]{#2}}{}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{key}{adjbox}{fgcolor*} +% Adds a colored box in the background. It awaits a direct color macro, +% which gives the user more flexibility. +% \begin{macrocode} +\define@key{ADJBOX}{fgcolor*}{% + \adjbox@checkcolor + \adjbox@innercode{#1}{}% +} +% \end{macrocode} +% \end{key} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{bgcolor} +% Adds a colored box in the background. +% |#1| are the argument to color, i.e. either \MacroArgs<color> +% or \MacroArgs{<model>}{<color>}. +% \begin{macrocode} +\define@key\adjbox@fam{bgcolor}{% + \adjbox@checkcolor + \@ifnextchar\bgroup{% + \adjbox@bgcolor + }{% + \adjbox@bgcolor{}{#1}% + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@bgcolor} +% Parses the two possible arguments and adds the background color macro +% to the token register. +% \begin{macrocode} +\def\adjbox@bgcolor#1#2#3\@nnil{% + \ifx\@nnil#1\@nnil + \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{\color{#2}}}}% + \else + \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{\color[#1]{#2}}}}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{bgcolor*} +% Adds a colored box in the background. It awaits a direct color macro, +% which gives the user more flexibility. +% \begin{macrocode} +\define@key\adjbox@fam{bgcolor*}{% + \adjbox@checkcolor + \adjbox@Gin@add{\@Collectbox{\@bgcolorbox{#1}}}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\@bgcolorbox} +% This places a colored box (vrule) with the same dimensions than +% the content, then compensates for the horizontal shift and places +% the content. This is simpler and more direct than using \Macro\rlap +% or a box macro from the \pkg{xcolor} package. +% +% The argument contains the color macro, e.g.\ \Macro\color{<color>}. +% \begin{macrocode} +\def\@bgcolorbox#1{% + \leavevmode + \hbox{% + \hbox{% + #1% + \vrule\@width\width\@height\height\@depth\depth% + }% + \hskip-\width + \BOXCONTENT + }% +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\bgcolorbox} +% \begin{macrocode} +\expandafter\newcommand\expandafter\bgcolorbox\expandafter{% + \expandafter + \@ifstar + \csname bgcolorbox*\endcsname + \bgcolorbox@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\bgcolorbox@} +% \begin{macrocode} +\newcommand\bgcolorbox@[2][\@nnil]{% + \collectboxcheckenv{bgcolorbox}% + \ifx\@nnil#1\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\@collectbox{\@bgcolorbox{\color{#2}}}}% + {\@collectbox{\@bgcolorbox{\color[#1]{#2}}}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{bgcolorbox*} +% \begin{macrocode} +\@namedef{bgcolorbox*}#1{% + \collectboxcheckenv{bgcolorbox*}% + \@collectbox{\@bgcolorbox{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\fgimagebox} +% \begin{macrocode} +\expandafter\newcommand\expandafter\fgimagebox\expandafter{% + \expandafter + \@ifstar + \csname fgimagebox*\endcsname + \fgimagebox@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fgimagebox@} +% \begin{macrocode} +\newcommand\fgimagebox@[2][]{% + \collectboxcheckenv{fgimagebox}% + \@collectbox{\@foregroundbox\adjustimage{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{fgimagebox*} +% \begin{macrocode} +\expandafter\newcommand\csname fgimagebox*\endcsname[2][]{% + \collectboxcheckenv{fgimagebox*}% + \@collectbox{\@foregroundbox\adjustimage{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{key}{adjbox}{fgimage} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{fgimage}{% + \@ifnextchar\bgroup{% + \adjbox@fgimage + }{% + \adjbox@fgimage{}{#1}% + }#1{}\@nnil + {,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{fgimage*} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{fgimage*}{% + \@ifnextchar\bgroup{% + \adjbox@fgimage + }{% + \adjbox@fgimage{}{#1}% + }#1{}\@nnil{}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@fgimage} +% \begin{macrocode} +\def\adjbox@fgimage#1#2#3\@nnil#4{% + \adjbox@Gin@Add{\@Collectbox{\@foregroundbox\adjustimage{#1#4}{#2}}}% +} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\bgimagebox} +% \begin{macrocode} +\expandafter\newcommand\expandafter\bgimagebox\expandafter{% + \expandafter + \@ifstar + \csname bgimagebox*\endcsname + \bgimagebox@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bgimagebox@} +% \begin{macrocode} +\newcommand\bgimagebox@[2][]{% + \collectboxcheckenv{bgimagebox}% + \@collectbox{\@backgroundbox\adjustimage{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{bgimagebox*} +% \begin{macrocode} +\expandafter\newcommand\csname bgimagebox*\endcsname[2][]{% + \collectboxcheckenv{bgimagebox*}% + \@collectbox{\@backgroundbox\adjustimage{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{key}{adjbox}{bgimage} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{bgimage}{% + \@ifnextchar\bgroup{% + \adjbox@bgimage + }{% + \adjbox@bgimage{}{#1}% + }#1{}\@nnil + {,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{bgimage*} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{bgimage*}{% + \@ifnextchar\bgroup{% + \adjbox@bgimage + }{% + \adjbox@bgimage{}{#1}% + }#1{}\@nnil{}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@bgimage} +% \begin{macrocode} +\def\adjbox@bgimage#1#2#3\@nnil#4{% + \adjbox@Gin@Add{\@Collectbox{\@backgroundbox\adjustimage{#1#4}{#2}}}% +} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{foreground} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{foreground}{% + \@ifnextchar\bgroup{% + \adjbox@foreground + }{% + \adjbox@foreground{}{#1}% + }#1{}{}\@nnil + {,width=\pwidth,totalheight=\ptotalheight,raise=\depth-\pdepth}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{foreground*} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{foreground*}{% + \@ifnextchar\bgroup{% + \adjbox@foreground + }{% + \adjbox@foreground{}{#1}% + }#1{}{}\@nnil{}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@foreground} +% \begin{macrocode} +\def\adjbox@foreground#1#2#3\@nnil#4{% + \adjbox@Gin@Add{\@Collectbox{\@foregroundbox\adjustbox{#1#4}{#2}}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@foregroundbox} +% \begin{macrocode} +\def\@foregroundbox#1#2#3{% + \leavevmode + \hbox to \width{% + \BOXCONTENT + \hskip-\width + \hss + \adjbox@parentdims + #1{#2}{#3}% + \hss + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\foregroundbox} +% \begin{macrocode} +\expandafter\newcommand\expandafter\foregroundbox\expandafter{% + \expandafter + \@ifstar + \csname foregroundbox*\endcsname + \foregroundbox@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\foregroundbox@} +% \begin{macrocode} +\newcommand\foregroundbox@[2][]{% + \collectboxcheckenv{foregroundbox}% + \@collectbox{\@foregroundbox\adjustbox{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{foregroundbox*} +% \begin{macrocode} +\expandafter\newcommand\csname foregroundbox*\endcsname[2][]{% + \collectboxcheckenv{foregroundbox*}% + \@collectbox{\@foregroundbox\adjustbox{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{background} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{background}{% + \@ifnextchar\bgroup{% + \adjbox@background + }{% + \adjbox@background{}{#1}% + }#1{}{}\@nnil + {,width=\pwidth,totalheight=\ptotalheight,raise=\depth-\pdepth}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{background*} +% One or two arguments, the first optional one are further \Macro\includegraphics keys. +% \begin{macrocode} +\define@key{adjbox}{background*}{% + \@ifnextchar\bgroup{% + \adjbox@background + }{% + \adjbox@background{}{#1}% + }#1{}{}\@nnil{}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@background} +% \begin{macrocode} +\def\adjbox@background#1#2#3\@nnil#4{% + \adjbox@Gin@Add{\@Collectbox{\@backgroundbox\adjustbox{#1#4}{#2}}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@backgroundbox} +% \begin{macrocode} +\def\@backgroundbox#1#2#3{% + \leavevmode + \hbox to \width{% + \hss + \adjbox@parentdims + #1{#2}{#3}% + \hss + \hskip-\width% + \BOXCONTENT + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\backgroundbox} +% \begin{macrocode} +\expandafter\newcommand\expandafter\backgroundbox\expandafter{% + \expandafter + \@ifstar + \csname backgroundbox*\endcsname + \backgroundbox@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\backgroundbox@} +% \begin{macrocode} +\newcommand\backgroundbox@[2][]{% + \collectboxcheckenv{backgroundbox}% + \@collectbox{\@backgroundbox\adjustbox{#1,width=\pwidth,totalheight=\ptotalheight,raise=-\pdepth}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{backgroundbox*} +% \begin{macrocode} +\expandafter\newcommand\csname backgroundbox*\endcsname[2][]{% + \collectboxcheckenv{backgroundbox*}% + \@collectbox{\@backgroundbox\adjustbox{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Lapping keys and macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{lap} +% \begin{macrocode} +\define@key\adjbox@fam{lap}{% + \@ifnextchar\bgroup{% + \adjbox@lapbox + }{% + \adjbox@lapbox{#1}{}% + }#1{}{}\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@lapbox} +% \begin{macrocode} +\def\adjbox@lapbox#1#2#3\@nnil{% + \ifx\@nnil#2\@nnil + \adjbox@Gin@Add{\lapbox{#1}}% + \else + \adjbox@Gin@Add{\lapbox[{#1}]{#2}}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{rlap} +% \begin{macrocode} +\define@key\adjbox@fam{rlap}[]{% + \adjbox@Gin@Add{\lapbox{\width}}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{llap} +% \begin{macrocode} +\define@key\adjbox@fam{llap}[]{% + \adjbox@Gin@Add{\lapbox{-\width}}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\lapbox} +% \begin{macrocode} +\newcommand*\lapbox[2][\width-\@tempdimb]{% + \collectboxcheckenv{lapbox}% + \@collectbox{\@lapbox{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@lapbox} +% \begin{macrocode} +\def\@lapbox#1#2{% + \adjsetlength\@tempdima{#2}% + \ifdim\@tempdima<\z@ + \@tempdimb=-\@tempdima + \else + \@tempdimb=\@tempdima + \fi + \adjsetlength\@tempdimc{#1}% + \ifdim\@tempdimc<\z@ + \@tempdimc=\z@ + \fi + \leavevmode + \ifdim\@tempdima<\z@ + \hb@xt@\@tempdimc{\hss\hb@xt@\@tempdimb{\usebox\collectedbox\hss}\hskip\@tempdimc}% + \else + \hb@xt@\@tempdimc{\hskip\@tempdimc\hb@xt@\@tempdimb{\hss\usebox\collectedbox}\hss}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Keys for minibox and varwidth} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{ADJBOX}{minipage} +% \begin{macrocode} +\define@key{ADJBOX}{minipage}{% + \adjbox@page{minipage}{#1}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{ADJBOX}{varwidth} +% \begin{macrocode} +\define@key{ADJBOX}{varwidth}{% + \adjbox@page{varwidth}{#1}% +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@page} +% If the value starts with "[" or "{" take the value as it is, +% otherwise assume that is a single length expression and add the required "{ }". +% \begin{macrocode} +\def\adjbox@page#1#2{% + \@ifnextchar[{% + \adjbox@@page{#1}% + }{% + \@ifnextchar\bgroup{% + \adjbox@@page{#1}% + }{% + \adjbox@@page{#1}{{#2}}\@nnil% + \remove@to@nnil + }% + }#2\@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@@page} +% Sets collect-box command to use \env{minipage} or similar environment. +% +% The \Macro\setlength macro is change temporary for the \env{minipage} or \env{varwidth} environment. +% \begin{macrocode} +\def\adjbox@@page#1#2\@nnil{% + \adjbox@innercode + {\adjbox@set\begin{#1}#2\adjbox@reset\ignorespaces}% + {\end{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@set} +% Sets \Macro\setlength to \pkg{adjcalc} version. +% \begin{macrocode} +\def\adjbox@set{% + \let\adjbox@origsetlength\setlength + \def\setlength{\adjsetlength}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@reset} +% Resets \Macro\setlength to normal version. +% \begin{macrocode} +\def\adjbox@reset{% + \let\setlength\adjbox@origsetlength +} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Stackbox keys and macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{macro}{\stackbox} +% \begin{macrocode} +\newcommand*\stackbox[1][c]{% + \collectboxcheckenv{stackbox}% + \@ifnextchar[%] + {\@stackbox{#1}}% + {\@@stackbox{#1}{b}[]}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stackbox} +% Read the third optional argument +% \begin{macrocode} +\def\@stackbox#1[#2]{% + \@testopt{\@@stackbox{#1}{#2}}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@stackbox} +% The \env{varwidth} environment is used because it is much simpler to use than \env{tabular}. +% The horizontal alignment is done by the usual text align macros. +% \begin{macrocode} +\def\@@stackbox#1#2[#3]{% + \collectbox@ + {\begin{varwidth}[#2]{\linewidth}\csname adjbox@halign@#1\endcsname#3\ignorespaces} + \BOXCONTENT + {\end{varwidth}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@halign@c} +% \begin{macro}{\adjbox@halign@l} +% \begin{macro}{\adjbox@halign@r} +% \begin{macro}{\adjbox@halign@j} +% Horizontal alignment macros. +% \begin{macrocode} +\def\adjbox@halign@c{\centering} +\def\adjbox@halign@l{\raggedright} +\def\adjbox@halign@r{\raggedleft} +\def\adjbox@halign@j{\let\\\newline} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{key}{ADJBOX}{stack} +% \begin{macrocode} +\define@key{ADJBOX}{stack}[{}{}{}]{% + \adjbox@stack#1{}{}{}\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@stack} +% \begin{macrocode} +\def\adjbox@stack#1#2#3#4\@nnil{% + \ifx\@nnil#1\@nnil + \adjbox@@stack{c}{b}{}% + \else + \ifx\@nnil#2\@nnil + \adjbox@@stack{#1}{b}{}% + \else + \adjbox@@stack{#1}{#2}{#3}% + \fi\fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@@stack} +% \begin{macrocode} +\def\adjbox@@stack#1#2#3{% + \adjbox@innercode{% + \begin{varwidth}[#2]{\linewidth}% + \csname adjbox@halign@#1\endcsname#3% + \ignorespaces + }{% + \end{varwidth}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% Load the \pkg{varwidth} package if available or disable the dependent keys if not. +% \begin{macrocode} +\IfFileExists{varwidth.sty} + {\RequirePackage{varwidth}}{% + \define@key{ADJBOX}{varwidth}{% + \PackageError{adjustbox}{The 'varwidth' key requires the 'varwidth' package, which is not installed}{}% + } + \define@key{ADJBOX}{stack}{% + \PackageError{adjustbox}{The 'stack' key requires the 'varwidth' package, which is not installed}{}% + } +}% +% \end{macrocode} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{tabular and array keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{key}{ADJBOX}{tabular} +% \begin{macrocode} +\define@key{ADJBOX}{tabular}{% + \@ifnextchar[{% + \adjbox@tabular{tabular}% + }{% + \adjbox@tabular{tabular}{{#1}}\@nnil% + \remove@to@nnil + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@tabular} +% \begin{macrocode} +\def\adjbox@tabular#1#2\@nnil{% + \ifcollectboxenv + \adjbox@innerenv{#1}{#2}\@nnil + \else + \def\adjbox@collectbox##1{\collectbox@tab{#1}{#2}{\adjbox@begininnercode}{##1}{\adjbox@endinnercode}}% + \fi + \chardef\adjbox@innerlevel\tw@ +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{ADJBOX}{tabular*} +% \begin{macrocode} +\define@key{ADJBOX}{tabular*}{% + \adjbox@tabular{tabular*}#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{ADJBOX}{array} +% \begin{macrocode} +\define@key{ADJBOX}{array}{% + \@ifnextchar[{% + \adjbox@array% + }{% + \adjbox@array{{#1}}\@nnil% + \remove@to@nnil + }#1\@nnil +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@array} +% \begin{macrocode} +\def\adjbox@array#1\@nnil{% + \ifcollectboxenv + \adjbox@innercode{\(\begin{array}#1}{\end{array}\)}% + \else + \def\adjbox@collectbox##1{\collectbox@tab{array}{#1}{\adjbox@begininnercode\(}{##1}{\)\adjbox@endinnercode}}% + \fi + \chardef\adjbox@innerlevel\tw@ +} +% \end{macrocode} +% \end{macro} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Keys for inner environments and code} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{key}{ADJBOX}{innerenv} +% \begin{macrocode} +\define@key{ADJBOX}{innerenv}{% + \@ifnextchar\bgroup{% + \adjbox@@innerenv + }{% + \adjbox@innerenv{#1}\@nnil% + \remove@to@nnil + }#1\@nnil +} +\adjbox@let@key{ADJBOX}{inner env}{innerenv} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@innerenv} +% \begin{macrocode} +\def\adjbox@innerenv#1#2\@nnil{% + \adjbox@innercode + {\begin{#1}#2}% + {\end{#1}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@innerenv} +% \begin{macro}{\adjbox@@innerenv} +% \begin{macro}{\adjbox@@@innerenv} +% Used to extract the environment arguments. The issue here is that if a single mandatory argument is used +% its braces are removed. To avoid that a `|{}|' is always added beforehand and then removed again. +% \begin{macrocode} +\def\adjbox@@innerenv#1{% + \adjbox@@@innerenv{#1}{}% +}% +\def\adjbox@@@innerenv#1#2\@nnil{% + \expandafter\adjbox@@@@innerenv\expandafter{\@gobble#2}{#1}% +}% +\def\adjbox@@@@innerenv#1#2{% + \adjbox@innerenv{#2}{#1}\@nnil +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{key}{ADJBOX}{innercode} +% \begin{macrocode} +\define@key{ADJBOX}{innercode}{% + \adjbox@innercode#1{}{}% +}% +\adjbox@let@key{ADJBOX}{inner code}{innercode} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@innercode} +% \begin{macrocode} +\def\adjbox@innercode{% + \ifcase\adjbox@innerlevel + \relax% 0: first inner code + \def\adjbox@collectbox##1{\collectbox@{\adjbox@begininnercode\adjustbox@ignorespaces}{##1}{\adjustbox@unskip\adjbox@endinnercode}}% + \chardef\adjbox@innerlevel\@ne + \expandafter\adjbox@@innercode + \or% 1 append inner code, no inner env + \expandafter\adjbox@@innercode + \else% 2 inner tabular exists, create warning and ignore content. + \PackageWarning{adjustbox}{Further inner code or environment ignored\MessageBreak after "tabular"-like key}% + \expandafter\@gobbletwo + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@@innercode} +% \begin{macrocode} +\long\def\adjbox@@innercode#1#2{% + \@temptokena\expandafter{\adjbox@begininnercode#1}% + \edef\adjbox@begininnercode{\the\@temptokena}% + \@temptokena{#2}% + \@temptokena\expandafter\expandafter\expandafter{\expandafter\the\expandafter\@temptokena\adjbox@endinnercode}% + \edef\adjbox@endinnercode{\the\@temptokena}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Float keys} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{label} +% \begin{macrocode} +\define@key\adjbox@fam{label}{% + \def\adjbox@label{\label{#1}}% +} +\let\adjbox@label\@empty +% \end{macrocode} +% \end{key} +% +% \begin{macrocode} +\chardef\adjbox@caption@pos=11 +% \end{macrocode} +% +% \begin{key}{adjbox}{captionabove} +% \begin{macrocode} +\define@key\adjbox@fam{captionabove}{% + \chardef\adjbox@caption@pos=1 + \csname KV@\adjbox@fam @caption\endcsname{#1}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{captionbelow} +% \begin{macrocode} +\define@key\adjbox@fam{captionbelow}{% + \chardef\adjbox@caption@pos=0 + \csname KV@\adjbox@fam @caption\endcsname{#1}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{caption} +% \begin{macrocode} +\define@key\adjbox@fam{caption}{% + \@ifnextchar{[}{% + \adjbox@def@caption + }{% + \adjbox@def@@caption + }#1\@nnil +} +\def\adjbox@def@@caption#1\@nnil{% + \def\adjbox@caption{\caption{#1}}% +} +\def\adjbox@def@caption[#1]#2\@nnil{% + \def\adjbox@caption{\caption[#1]{#2}}% +} +\let\adjbox@caption\@empty +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{figure} +% \begin{macrocode} +\define@key\adjbox@fam{figure}[]{% + \let\adjustbox@noindent\relax + \ifx\@nnil#1\@nnil + \adjbox@addfloat{figure}{\begin{figure}}{}{\end{figure}}% + \else + \adjbox@addfloat{figure}{\begin{figure}}{[{#1}]}{\end{figure}}% + \fi +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{float} +% \begin{macrocode} +\define@key\adjbox@fam{float}{% + \let\adjustbox@noindent\relax + \@ifnextchar\bgroup{% + \adjbox@float + }{% + \adjbox@float{#1}{}\@nnil + \remove@to@nnil + }#1\@nnil +} +\def\adjbox@float#1#2\@nnil{% + \adjbox@addfloat{#1}{\begin{#1}}{#2}{\end{#1}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{nofloat} +% \begin{macrocode} +\define@key\adjbox@fam{nofloat}[figure]{% + \adjbox@addfloat{#1}{\adjnofloat}{{#1}}{\endadjnofloat}% +} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\adjbox@caption@table@pos} +% \begin{macrocode} +\def\adjbox@caption@table@pos{1} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\adjbox@addfloat} +% \begin{macrocode} +\def\adjbox@addfloat#1#2#3#4{% + \Gin@esetsize + \@tempswatrue + \ifnum\adjbox@caption@pos>10 + \chardef\adjbox@caption@pos=0\csname adjbox@caption@#1@pos\endcsname\relax + \fi + \ifcase\adjbox@caption@pos + \def\@tempa{\adjust@addcode{#2#3}}% + \expandafter\expandafter\expandafter\@tempa + \expandafter\expandafter\expandafter{\expandafter\adjbox@caption\adjbox@label#4}% + \else + \def\@tempa##1{\adjust@addcode{#2#3\adjbox@captionabove##1}}% + \expandafter\expandafter\expandafter\@tempa + \expandafter\expandafter\expandafter + {\expandafter\adjbox@caption\adjbox@label}{#4}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@captionabove} +% \begin{macrocode} +\@ifpackageloaded{caption}{% + \let\adjbox@captionabove\relax +}{% + \def\adjbox@captionabove{% + \begingroup + \edef\@tempa{\endgroup + \abovecaptionskip=\the\belowcaptionskip\relax + \belowcaptionskip=\the\abovecaptionskip\relax + }% + \@tempa + }% + \AtBeginDocument{% + \@ifpackageloaded{caption}{% + \global\let\adjbox@captionabove\relax + }{}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@nofloatenv} +% \begin{macrocode} +\def\adjbox@nofloatenv{minipage} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjbox@nofloatcaptionsetup} +% Calls \Macro\captionsetup from the \pkg{caption} package if defined, otherwise sets \Macro\@captype directly. +% Calls \Macro\capstart from the \pkg{hypcap} package if defined. Both are done to ensure correct hypertargets on top +% of the content and not at the caption position. +% \begin{macrocode} +\def\adjbox@nofloatcaptionsetup#1{% + \@ifundefined{captionsetup}% + {\def\@captype{#1}}% + {\captionsetup{type={#1}}}% +\csname capstart\endcsname +} +% \end{macrocode} +% \end{macro}% +% +% \begin{environment}{adjnofloat} +% Environment used for non-floats. +% \begin{macrocode} +\newenvironment{adjnofloat}[1]{% + \par\noindent + \minipage{\linewidth}% + \adjbox@nofloatcaptionsetup{#1}% +}{% + \endminipage\par +} +% \end{macrocode} +% \end{environment} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Change or discard the content} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{phantom} +% \begin{macrocode} +\define@key\adjbox@fam{phantom}[]{% + \expandafter\ifx\csname #1phantom\endcsname\relax + \adjust@addcode{\phantom}{}% + \else + \expandafter\adjust@addcode\expandafter{\csname #1phantom\endcsname}{}% + \fi +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\phantombox}[3]{width}{height}{depth} +% Produces an empty box with the given width, height and depth. +% \begin{macrocode} +\newcommand*\phantombox[3]{% + \begingroup + \adjsetlength\@tempdima{#1}% + \adjsetlength\@tempdimb{#2}% + \adjsetlength\@tempdimc{#3}% + \setbox\collectedbox\hbox{}% + \wd\collectedbox\@tempdima + \ht\collectedbox\@tempdimb + \dp\collectedbox\@tempdimc + \leavevmode + \box\collectedbox + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{gobble} +% Discards the content. +% \begin{macrocode} +\define@key\adjbox@fam{gobble}[\@nil]{% + \adjbox@novalue{#1}% + \let\adjustbox@noindent\relax + \adjbox@Gin@Add{\@Collectbox{}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{discard} +% Alias of \Key{gobble}. +% \begin{macrocode} +\adjbox@let@key\adjbox@fam{discard}{gobble}% +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{adjbox}{content} +% Replaces the content. The old content is still processed completely before being replaced.. +% \begin{macrocode} +\define@adjboxkey{content}{\@Collectbox{#1}}% +% \end{macrocode} +% \end{key} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Store box content and sizes} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{key}{adjbox}{gstore} +% Store the current content into a box without removing it. +% \begin{macrocode} +\define@adjboxkey{gstore}{\global\@collectboxto{#1}{\BOXCONTENT}} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore*} +% Store the content into a box only. +% \begin{macrocode} +\define@key\adjbox@fam{gstore*}{% + \let\adjustbox@noindent\relax + \adjbox@Gin@Add{\global\sbox{#1}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore width} +% \begin{macrocode} +\define@key{adjbox}{gstore width}{% + \adjbox@Gin@Add{\@Collectbox{\global#1=\width\BOXCONTENT}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore depth} +% \begin{macrocode} +\define@key{adjbox}{gstore depth}{% + \adjbox@Gin@Add{\@Collectbox{\global#1=\depth\BOXCONTENT}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore height} +% \begin{macrocode} +\define@key{adjbox}{gstore height}{% + \adjbox@Gin@Add{\@Collectbox{\global#1=\height\BOXCONTENT}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore totalheight} +% \begin{macrocode} +\define@key{adjbox}{gstore totalheight}{% + \adjbox@Gin@Add{\@Collectbox{\global#1=\totalheight\BOXCONTENT}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{key}{adjbox}{gstore sizes} +% \begin{macrocode} +\define@key{adjbox}{gstore sizes}{% + \adjbox@Gin@Add{\@Collectbox{\adjbox@gstore@sizes#1\relax\relax\relax\relax\@nnil\BOXCONTENT}}% +} +% \end{macrocode} +% \end{key} +% +% \begin{macro}{\adjbox@gstore@sizes}[4]{width register}{height register}{depth register}{totalheight register} +% Stores the width, height, depth and totalheight in the given registers if they are not empty (or \Macro\relax). +% \begin{macrocode} +\def\adjbox@gstore@sizes#1#2#3#4#5\@nnil{% + \ifx\relax#1\relax\else + \global#1=\width + \fi + \ifx\relax#2\relax\else + \global#2=\height + \fi + \ifx\relax#3\relax\else + \global#3=\depth + \fi + \ifx\relax#4\relax\else + \global#4=\totalheight + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Experimental split and pagebreak keys and macros} ^^A ((( +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macrocode} +%%\RequirePackage{storebox} +% \end{macrocode} +% +% \begin{macro}{\splitbox} +% \begin{macrocode} +\newcommand\splitbox[2]{% + \collectboxcheckenv{splitbox}% + \@collectbox{\@splitbox{#1}{#2}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{key}{adjbox}{split} +% \begin{macrocode} +\define@adjboxkey{split}{\@Collectbox{\@splitbox#1}} +% \end{macrocode} +% \end{key} +% +% +% \begin{macro}{\@splitbox} +% \begin{macrocode} +\def\@splitbox#1#2{% + \ifstorebox + \storebox\splittedbox{\BOXCONTENT}% + \setbox\collectedbox\hbox{\usestorebox\splittedbox}% + \fi + \xdef\@tempa{#1}% + \xdef\@tempb{#2}% + \ifx\@tempa\Gin@exclamation + \@tempdima\maxdimen + \else + \adjsetlength\@tempdima\@tempa + \fi + \ifx\@tempb\Gin@exclamation + \Gin@nat@height\maxdimen + \else + \adjsetlength\Gin@nat@height\@tempb + \fi + \ifdim\@tempdima>\width + \@tempdima\width + \fi + \ifdim\Gin@nat@height>\totalheight + \Gin@nat@height\totalheight + \fi + \tc@llx\z@ + \tc@lly\totalheight + \tc@urx\width + \tc@ury\z@ + \advance\tc@lly-\Gin@nat@height + \@@splitbox +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@splitbox} +% \begin{macrocode} +\def\@@splitbox{% + \advance\tc@urx-\@tempdima + \@@@splitbox + \ifdim\tc@urx>\z@ + \advance\tc@llx+\@tempdima + \expandafter\@@splitbox + \else + \ifdim\tc@lly<\splitbox@epsilon + \splitboxlastnewline + \else + \splitboxnewline + \tc@llx\z@ + \tc@urx\width + \advance\tc@lly-\Gin@nat@height + \advance\tc@ury+\Gin@nat@height + \expandafter\expandafter + \expandafter\@@splitbox + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@@splitbox} +% \begin{macrocode} +\def\@@@splitbox{% + \begingroup + \setbox\collectedbox=\copy\collectedbox + \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury + \splitboxcmd{\usebox\collectedbox}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@@splitbox} +% \begin{macrocode} +\def\@@@splitbox{% + \begingroup + \setbox\collectedbox=\copy\collectedbox + \@clipbox\collectedbox\tc@llx\tc@lly\tc@urx\tc@ury + \splitboxcmd{\usebox\collectedbox}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\splitboxcmd} +% \begin{macrocode} +\let\splitboxcmd\empty +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\splitboxnewline} +% \begin{macrocode} +\newcommand\splitboxnewline{\\} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\splitboxlastnewline} +% \begin{macrocode} +\newcommand\splitboxlastnewline{\splitboxnewline} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\splitbox@epsilon} +% \begin{macrocode} +\def\splitbox@epsilon{100sp} +% \end{macrocode} +% \end{macro} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\pagebreakbox} +% \begin{macrocode} +\newcommand\pagebreakbox{% + \par\noindent + \collectboxcheckenv{pagebreakbox}% + \@collectbox{\@pagebreakbox}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{key}{adjbox}{pagebreak} +% \begin{macrocode} +\define@key\adjbox@fam{pagebreak}[]{% + \adjbox@Gin@Add{\@Collectbox{\@pagebreakbox}}% +} +% \end{macrocode} +% \end{key} +% +% +% +% \begin{macro}{\@pagebreakbox} +% Used internal macros: +% +% \begin{tabular}{ll} +% \Macro\@tempa & Caption code \\ +% \Macro\@tempboxa & Caption box \\ +% \Macro\tc@lly & Lower clip amount \\ +% \Macro\tc@ury & Lower clip amount \\ +% \end{tabular} +% \begin{macrocode} +\def\@pagebreakbox{% + \sbox\collectedbox{\raise\dp\collectedbox\hbox{\BOXCONTENT}}% + \ifstorebox + \storebox\splittedbox{\BOXCONTENT}% + \setbox\collectedbox\hbox{\usestorebox\splittedbox}% + \fi + \adjsetlength\tc@lly + {\totalheight-\pagegoal+\pagetotal+\pagebreakboxoffset}% + \ifdim\tc@lly>\z@ + \begingroup + \setbox\collectedbox=\copy\collectedbox + \@clipbox\collectedbox\z@\tc@lly\z@\z@ + \BOXCONTENT + \endgroup + \par\noindent + \adjsetlength\tc@ury{\totalheight-\tc@lly}% + \ifdim\tc@lly>\textheight + \loop + \advance\tc@lly-\textheight + \begingroup + \setbox\collectedbox=\copy\collectedbox + \@clipbox\collectedbox\z@\tc@lly\z@\tc@ury + \BOXCONTENT + \endgroup + \advance\tc@ury\textheight + \par\noindent + \ifdim\tc@lly>\textheight + \repeat + \@clipbox\collectedbox\z@\z@\z@\tc@ury + \BOXCONTENT + \else + \@clipbox\collectedbox\z@\z@\z@\tc@ury + \par\noindent + \BOXCONTENT + \fi + \else + \BOXCONTENT% + \fi + \par +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pagebreakboxoffset} +% \begin{macrocode} +\newcommand*\pagebreakboxoffset{\ht\strutbox} +% \end{macrocode} +% \end{macro} +% +% +% ^^A ))) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% vim: foldenable foldmethod=marker foldmarker=(((,))) +% \iffalse +%</adjustbox.sty> +% \fi +% +% ^^A ))) +% \Finale +% \endinput +% ^^A vim: foldenable foldmethod=marker foldmarker=(((,))) diff --git a/macros/latex/contrib/adjustbox/adjustbox.ins b/macros/latex/contrib/adjustbox/adjustbox.ins new file mode 100644 index 0000000000..196015c47c --- /dev/null +++ b/macros/latex/contrib/adjustbox/adjustbox.ins @@ -0,0 +1,23 @@ +\input ydocstrip.tex +\keepsilent +\askforoverwritefalse +\generate{% + \file{adjustbox.sty}{\nopreamble\from{adjustbox.dtx}{adjustbox.sty}}% + \file{adjcalc.sty}{\nopreamble\from{adjcalc.dtx}{adjcalc.sty}}% + \file{trimclip.sty}{\nopreamble\from{trimclip.dtx}{trimclip.sty}}% + \file{tc-pgf.def}{\nopreamble\from{trimclip.dtx}{tc-pgf.def}}% + \file{tc-pdftex.def}{\nopreamble\from{trimclip.dtx}{tc-pdftex.def}}% + \file{tc-dvips.def}{\nopreamble\from{trimclip.dtx}{tc-dvips.def}}% + \file{tc-xetex.def}{\nopreamble\from{trimclip.dtx}{tc-xetex.def}}% + \file{box.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{box.tex}}% + \file{compare.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{compare.tex}}% + \file{margin2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{margin2.tex}}% + \file{margin.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{margin.tex}}% + \file{trim2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim2.tex}}% + \file{trim3.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim3.tex}}% + \file{trim.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{trim.tex}}% + \file{viewport2.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{viewport2.tex}}% + \file{viewport.tex}{\nopreamble\nopostamble\from{trimclip.dtx}{viewport.tex}}% +} +\endbatchfile +%% vim: ft=tex diff --git a/macros/latex/contrib/adjustbox/adjustbox.pdf b/macros/latex/contrib/adjustbox/adjustbox.pdf Binary files differnew file mode 100644 index 0000000000..f9ccff3764 --- /dev/null +++ b/macros/latex/contrib/adjustbox/adjustbox.pdf diff --git a/macros/latex/contrib/adjustbox/trimclip.dtx b/macros/latex/contrib/adjustbox/trimclip.dtx new file mode 100644 index 0000000000..0240ff55e2 --- /dev/null +++ b/macros/latex/contrib/adjustbox/trimclip.dtx @@ -0,0 +1,2351 @@ +% \iffalse meta-comment +%<=*COPYRIGHT> +%% Copyright (C) 2011-2018 by Martin Scharrer <martin@scharrer-online.de> +%% ---------------------------------------------------------------------- +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Martin Scharrer. +%% +%% This work consists of the files trimclip.dtx, adjustbox.ins +%% and the derived files trimclip.sty, +%% tc-dvips.def, tc-pdftex.def, tc-pgf.def and tc-xetex.def. +%% Further author information are located in the .def files. +%% +%<=/COPYRIGHT> +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{trimclip.dtx}[% +%<=*DATE> + 2018/04/08 +%<=/DATE> +%<=*VERSION> + v1.1 +%<=/VERSION> + DTX file for the trimclip package] +\documentclass[a4paper]{ydoc}[2011/11/16] +\GetFileInfo{trimclip.dtx} +\usepackage{trimclip}[\filedate] + +\usepackage[utf8]{inputenc} +\usepackage{standalone} + +%\AtBeginDocument{\MakeShortMacroArgs\`\relax} +%\AtEndDocument{\DeleteShortVerb\`} +% +\normalmarginpar + +\usepackage{flafter} + +\usepackage{tikz} +\usetikzlibrary{calc} +\newsavebox\mybox + +\renewenvironment{example}[1][Example:]{% + \subsubsection*{#1}% +}{% + \par +} +\newenvironment{examples}[1][Examples:]{% + \subsubsection*{#1}% +}{% + \par +} +\optionaloff + +\lstdefinelanguage{none}{}% +\lstdefinelanguage{adjustbox}{% + moretexcs={% + begin,end,adjustbox + }, + emph={% + frame,fbox,cframe,cfbox,minipage,raise + }, +}% + +\lstdefinestyle{examplecode}{% + basicstyle=\ttfamily\small, + numbers=none,language=none, + classoffset=1, + morekeywords={begin,end}, + keywordstyle=\bfseries, + classoffset=0, + morekeywords={adjustbox,minsizebox,maxsizebox,lapbox,marginbox,phantombox}, + keywordstyle=\macrodescstyle, +} + +\makeatletter +\def\PrintExample{% + \begingroup + \par\smallskip\noindent + \leavevmode + \BoxExample + \@tempdima=\textwidth + \advance\@tempdima by -\wd\examplecodebox\relax + \advance\@tempdima by -\wd\exampleresultbox\relax + \advance\@tempdima by -15pt\relax + \ifdim\@tempdima>\bigskipamount + \hbox to \textwidth{% + \null\hss + \minipage[c]{\wd\examplecodebox}\usebox\examplecodebox\endminipage + \hfill\hskip\bigskipamount\hfill + \minipage[c]{\wd\exampleresultbox}% + \EXAMPLERESULT + \endminipage + \hss\null + }% + \else + \vbox{% + \leftline{\usebox\examplecodebox}% + \vspace{\bigskipamount}% + \rightline{\EXAMPLERESULT}% + }% + \fi + \par\smallskip + \endgroup +} +\def\EXAMPLERESULT{% + \leavevmode\hbox{% + \textcolor{exampleborder}{% + \boxframe + {\dimexpr\wd\exampleresultbox+2\fboxrule\relax}% + {\dimexpr\ht\exampleresultbox+\fboxrule\relax}% + {\dimexpr\dp\exampleresultbox+\fboxrule\relax}% + \hskip-\wd\exampleresultbox + \hskip-\fboxrule + \rule[-.25\fboxrule]{\wd\exampleresultbox}{.5\fboxrule}% + \hskip-\wd\exampleresultbox + }% + \usebox\exampleresultbox + }% +}% +\makeatother +\colorlet{exampleborder}{black!33} +\def\Descsep{\par\vskip-2.5ex\relax} + +\def\examplecontent{\raisebox{-4pt}{\begin{tabular}[b]{@{}|c|c|@{}} + \hline + A & B \\ + \hline + C & D \\ + \hline + \end{tabular}% +}} + +%\EnableCrossrefs +%\CodelineIndex +%\RecordChanges +\OnlyDescription +\renewcommand\topfraction{.9} +\renewcommand\bottomfraction{.9} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.5} +\renewcommand\dbltopfraction{.7} +\renewcommand\dblfloatpagefraction{.5} +\begin{document} + \DocInput{trimclip.dtx} + \PrintChanges + %\newpage\PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{1118} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2012/05/16}{First version after extraction from \pkg{adjustbox} package.} +% \changes{v1.1}{2018/04/08}{Driver support for round corner clipping.} +% +% \GetFileInfo{trimclip.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\gdef,\let} +% \bundle{adjustbox} +% \author{Martin Scharrer} +% \email{martin@scharrer-online.de} +% ^^A\repository{https://bitbucket.org/martin_scharrer/adjustbox} +% \ydocpdfsettings +% \maketitle +% +% \makeatletter +% \def\LATeX{\texorpdfstring{(L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts +% \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em)\TeX}{(La)TeX}} +% \makeatother +% +% \vspace{-\baselineskip} +% \begin{abstract} +% This package extends the standard \pkg{graphicx} package by providing the missing \Macro\trimbox and \Macro\clipbox +% macros to trim and clip arbitrary \TeX\ material. +% The macros allow for verbatim content. Equivalent environments are also provided. +% The package comes with own clipping drivers for all common output formats as well as a \pkg{pgf} fall-back driver. +% \end{abstract} +% +% \section{Introduction} +% The standard \LaTeX{} package \pkg{graphicx}.^^A\footnote{Actually it is the \pkg{graphics} package, but +% ^^Athis is assumed to be completely superseded by its extension \pkg{graphicx}.} +% allows to scale, resize and rotate either images or text (i.e.\ any \TeX\ content). For text the macros +% \Macro\scalebox, \Macro\resizebox and \Macro\rotatebox can be used, while equivalent keys exist for the +% \Macro\includegraphics macro. However, while it is possible to trim and clip images using the \Key{trim}, \Key{viewport} +% and \Key{clip} keys, no equivalent macros are provided. This package closes this gap by defining the macros +% \Macro\trimbox and \Macro\clipbox. As an extra the macro \Macro\marginbox is also provided. It can be seen as an +% inverted \Macro\trimbox, expanding the official size of the content instead of reducing it. +% Originally these macros were included in the \pkg{adjustbox} package together with the general \Macro\adjustbox macro. +% However, the fundamental clip and trim macros and their driver files are now packed into this minimalistic package, +% so that other packages can reuse its functionality without the need to load the ever-growing \pkg{adjustbox} package. +% +% \enlargethispage{\baselineskip} +% The macros provided by this package differ in three aspects from the macros defined by \pkg{graphicx}. The content +% argument is actually read directly as a horizontal box and not as a macro argument, even when the syntax looks the +% same. This allows for arbitrary content including special things like verbatim material. It is allowed to replace the +% "{ }" around the content with \Macro\bgroup and \Macro\egroup. Furthermore, for every macro there is an equivalent +% environment with the same name. Special care is taken to allow the same name for both, which is normally not allowed. +% Finally, the lengths arguments of the macros can contain algebraic expressions to calculate the used length. This is +% only possible with the \pkg{graphicx} macros if the \pkg{calc} package is loaded. However, the \pkg{trimclip} macros +% use the \pkg{adjcalc} wrapper package which either uses $\epsilon$-\TeX\ primitives, \pkg{calc} or \pkg{pgfmath} to +% provide this feature. +% +% +% \section{Dependencies} +% This package uses the author's other packages \pkg{collectbox} (to collect the content as a real box) and +% \pkg{adjcalc} (to allow for math expressions for lengths). The latter is part of the same \pkg{adjustbox} bundle and +% should have be installed together with \pkg{trimclip}. +% +% \section{Drivers} +% The clip operation can not be implemented using general \TeX\ commands, but is rather output format specific. The +% clipped material is actually included unclipped and the output file (i.e.\ PDF or PS file) contains format specific +% instructions, so that the document viewer will clip the content when the document is displayed. Depending on the used +% compilation work-flow (like |pdflatex|, |latex|+|dvips| or |latex|+|dvipdfm|, etc.) this clipping instructions must be +% passed in a different way. In order to support all of these, dedicated driver files are provided which hold the +% specific low-level instructions. This requirement should also be known to most users from the \pkg{graphics/x}, +% \pkg{(x)color} or \pkg{hyperref} packages which also require output format specific low-level instructions to +% implement their features. +% +% A set of driver files for the most common used \LaTeX\ compilers is provided with this package (see +% \autoref{sec:options} for a list). If no suitable driver file is found, the \pkg{pgf} package is used instead to +% implement the clip operation. This (large) package comes with its own set of driver files and should cover any other +% \LaTeX\ compilers. The \pkg{trimclip} drivers were inspired by the \pkg{graphic/x} and \pkg{pgf} driver code and +% were written by Joseph Wright of the \LaTeX3 project and Martin Scharrer (the author of this package). +% +% \section{Package Options}\label{sec:options} +% Normally the package should be loaded without any options. A suitable driver will then automatically be selected. +% However, the package accepts the following options to select the used driver manually. Any other option is passed to the +% \pkg{graphicx} package and the driver selected by it is used. However, this does not work if \pkg{graphicx} or +% \pkg{graphics} was already loaded before. In this case any unknown option is taken as driver and a file +% `\MacroArgs'tc-'<option>'.def'\relax' is loaded if it exits. If not, the default PGF fall-back driver is used. PGF +% comes with a own set of drivers but is large and can be considered a significant overhead if used only for rectangular +% clipping. +% +% \begin{description} +% \def\Option#1{\item[{{\normalfont\opt{#1}}}]}% +% \Option{pdftex} Use the |pdftex| driver. This driver is automatically selected for |pdflatex| and |lualatex| +% and should not be used for any other \LaTeX\ compilers. +% \Option{dvips} Use the |dvips| driver. This driver is automatically selected for |latex|. +% \Option{xetex} Use the |xetex| driver. This driver is automatically selected for |xelatex|. +% \Option{dvipdfm} Use the |xetex| driver which is also compatible with |dvipdfm|. +% \Option{dvipdfmx} Use the |xetex| driver which is also compatible with |dvipdfmx|. +% \Option{pgf} Use the fall-back PGF driver explicitly. This makes sense if issue with another driver are encountered. +% \end{description} +% +% It should be noted that choosing an incorrect driver will lead to clip operation not being applied (they act like trim +% operations) and may lead to a broken output file. +% +% +% \section{Argument Values}\label{sec:argval} +% All macros of this package and their matching environments require four length values which are used to change the +% left, bottom, right and top side of the content. Because of the used \pkg{adjcalc} package complicated algebraic +% expressions can be used to calculate these amounts. The used math engine can be changed by loading \pkg{adjcalc} +% with the appropriate option before loading \pkg{trimclip}. Please see the \pkg{adjcalc} manual for more details +% on this. +% Like with the |trim| or |viewport| keys of \Macro\includegraphics the length values must be separated by spaces. +% Note that if a previous length expression ends in a macro any trailing spaces will be removed by \TeX. Therefore it +% is required to wrap this \emph{complete} length expression in braces. +% Several examples of this are shown in the \emph{Usage} section. +% It is also possible to only provide a single length which is used for all four +% sides or only two lengths which are taken for the left/right as well as bottom/top side. This simplifies symmetric +% operations and got inspired by Cascading Style Sheets (CSS) used to style websites. +% +% If a length value is a simple number without a unit, a default unit is substituted (usually `|bp|', \emph{big points}, +% the standard PostScript and PDF unit). This default unit can be changed using \Macro\adjcalc{'defaultunit='<unit>} or +% completely disabled (\MacroArgs'defaultunit=none'). See the \pkg{adjcalc} manual for more details. +% +% The length values can contain the following macros to refer to the original size of the content: +% +% \DescribeMacros +% \hbox{\Macro\width~~~\Macro\height~~~\Macro\depth~~~\Macro\totalheight}% +% \endDescribeMacros +% These \LaTeX{} lengths hold the original dimensions of the content and can be used to make relative changes. Like any +% other length registers they can be used with a factor, e.g.\ \MacroArgs'.5'\AlsoMacro\width to refer to half the +% natural width of the content. +% +% +% \section{Usage} +% +% \subsection{Trimming} +% \vspace{-\medskipamount} +% \DescribeMacro\trimbox{<llx>~<lly>~<urx>~<ury>}{<content>} +% \DescribeMacro\trimbox{<all sites>}{<content>} +% \DescribeMacro\trimbox{<left/right>~<top/bottom>}{<content>} +% \DescribeMacro\trimbox*{<llx>~<lly>~<urx>~<ury>}{<content>} +% The macro \Macro\trimbox trims the given amount from the lower left (ll) and the upper right (ur) corner of +% the box. This means that the amount \meta{llx} is trimmed from the left side, \meta{lly} from the bottom and +% \meta{urx} and \meta{ury} from the right and top of the box, respectively. +% If only one value is given it will be used for all four sites. +% If only two values are given the first one will be used for the left and right side (llx, urx) and the second for the bottom and top side (lly, ury). +% +% If the starred version is used the four coordinates are taken as the \Key{viewport} instead, i.e. the box +% is trimmed to the rectangle described by the coordinates. In this case all four values must be specified explicitly. +% +% \begin{examples} +% \begin{examplecode} +% \examplecontent +% \end{examplecode} +% \begin{examplecode} +% \trimbox{2pt 3pt 2pt 3pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \trimbox{2pt 3pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \trimbox{2pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \trimbox{{.5\width} {.5\totalheight} 2pt 2pt} +% {\examplecontent} +% \end{examplecode} +% \medskip +% \begin{examplecode} +% \trimbox*{5pt 0pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \medskip +% \begin{examplecode} +% \trimbox*{5pt -2pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \medskip +% \begin{examplecode} +% \trimbox*{5pt 10pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \bigskip +% \bigskip +% \begin{examplecode} +% \trimbox*{5pt -3pt 3em -1pt}{\examplecontent} +% \end{examplecode} +% \end{examples} +% +% +% \DescribeEnv[<content>]{trimbox}{<1, 2 or 4 trim values>} +% \vspace{-\baselineskip} +% \DescribeEnv[<content>]{trimbox*}{<llx>~<lly>~<urx>~<ury>} +% The \env{trimbox} and \env{trimbox*} environments do the same as the corresponding macros. +% +% +% \Needspace*{10\baselineskip} +% \subsection{Clipping} +% \vspace{-\medskipamount} +% \DescribeMacro\clipbox{<llx>~<lly>~<urx>~<ury>}{<content>} +% \DescribeMacro\clipbox{<all sites>}{<content>} +% \DescribeMacro\clipbox{<left/right>~<top/bottom>}{<content>} +% \DescribeMacro\clipbox*{<llx>~<lly>~<urx>~<ury>}{<content>} +% The \Macro\clipbox macro works like the \Macro\trimbox and trims the given amounts from the \meta{text}. +% However, in addition the trimmed material is also clipped, i.e. it is not shown in the final document. +% Note that the material will still be part of the output file but is simply not shown. +% The full content can still be exported using special tools, so using \Macro\clipbox\relax (or \Macro\includegraphics[clip,trim=...]) +% to censor classified information would be a bad idea. +% The starred version will again use the given coordinates as viewport. +% +% \DescribeEnv[<content>]{clipbox}{<1, 2 or 4 trim values>} +% \vspace{-\baselineskip} +% \DescribeEnv[<content>]{clipbox*}{<llx>~<lly>~<urx>~<ury>} +% The environment versions of \Macro\clipbox and \Macro\clipbox*. The same rules as for the trimming environments apply. +% +% \begin{examples} +% \begin{examplecode} +% \examplecontent +% \end{examplecode} +% \begin{examplecode} +% \clipbox{2pt 3pt 2pt 3pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \clipbox{2pt 3pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \clipbox{2pt}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \clipbox{{.5\width} {.5\totalheight} 2pt 2pt} +% {\examplecontent} +% \end{examplecode} +% \medskip +% \begin{examplecode} +% \clipbox*{5pt 0pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \medskip +% \begin{examplecode} +% \clipbox*{5pt -2pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \clipbox*{5pt 10pt 3em 2em}{\examplecontent} +% \end{examplecode} +% \begin{examplecode} +% \clipbox*{5pt -3pt 3em -1pt}{\examplecontent} +% \end{examplecode} +% \end{examples} +% +% \subsection{Margin} +% \vspace{-\medskipamount} +% \DescribeMacro\marginbox{<all sites>}{<content>} +% \DescribeMacro\marginbox{<left/right>~<top/bottom>}{<content>} +% \DescribeMacro\marginbox{<llx>~<lly>~<urx>~<ury>}{<content>} +% \Descsep +% \DescribeEnv[<content>]{marginbox*}{<1, 2 or 4 margin values>} +% This macro and environment can be used to add a margin (white space) around the content. It can be seen as the opposite of \Macro\trimbox. +% The original baseline of the content is preserved because \meta{lly} is added to the depth. +% +% \begin{example} +% \begin{examplecode} +% Before \fbox{\marginbox{1ex 2ex 3ex 4ex}{Text}} After +% \end{examplecode} +% \end{example} +% +% +% \DescribeMacro\marginbox'*'{<all sites>}{<content>} +% \DescribeMacro\marginbox'*'{<left/right>~<top/bottom>}{<content>} +% \DescribeMacro\marginbox'*'{<llx>~<lly>~<urx>~<ury>}{<content>} +% \Descsep +% \DescribeEnv[<content>]{marginbox}{<1, 2 or 4 margin values>} +% This starred version is almost identical to the normal \Macro\marginbox, but also raises the content by the \MacroArgs<lly> +% amount, so that the original depth is preserved instead of the original baseline. +% Note that while \Macro\marginbox is basically the opposite of \Macro\trimbox, \Macro\marginbox* is not the opposite of \Macro\trimbox*. +% +% \begin{example} +% \begin{examplecode} +% Before \fbox{\marginbox*{1ex 2ex 3ex 4ex}{Text}} After +% \end{examplecode} +% \end{example} +% +% +% \clearpage +% \section{Diagrams} +% ^^A This section explains the details about the trim and clip implementations. +% ^^A It should give the interested reader a deeper understanding of the operations and the behaviour in normal and edge cases. +% The box dimensions, trim values and change of the baseline for different scenarios are visualized by the following diagrams. +% +% \begin{figure}[!bt] +% \centering +% {\catcode`\%=14\relax\input{box}} +% \caption{Box dimensions. Shown are also the \LaTeX\ macros and the \TeX\ primitives. Here \cs{br} stands for a box register. +% Note that the depth is a positive values on its own downwards pointed axes. +% }\label{fig:boxdim} +% \end{figure} +% +% \begin{figure}[!bt] +% \centering +% {\catcode`\%=14\relax\input{trim}} +% \caption{Trimming. The four values are removed from each side.}\label{fig:trim} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{trim2}} +% \caption{Trimming with \texttt{lly}$>$depth. In this case the resulting box moves up to the original baseline.}\label{fig:trim2} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{trim3}} +% \caption{Trimming with \texttt{ury}$>$height. In this case the resulting box falls down to the original baseline}\label{fig:trim2} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{viewport}} +% \caption{Viewport with \texttt{lly}$>$0pt. The \texttt{ll} and \texttt{ur} values are taken from the origin. The baseline is the vertical zero reference.}\label{fig:viewport} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{viewport2}} +% \caption{Viewport with \texttt{lly}$<$0pt. In this case the viewport ranges into the depth of the original box.} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{margin}} +% \caption{Marginbox. The \texttt{llx} and \texttt{urx} are added to the left and right and increase the width. The \texttt{ury} is added to the height +% and \texttt{lly} to the depth of the box. This keeps the baseline at the original position.} +% \label{fig:margin} +% \end{figure} +% +% \begin{figure} +% \centering +% {\catcode`\%=14\relax\input{margin2}} +% \caption{Marginbox*. In addition to the normal margin the content +% is also raised by \texttt{lly}, so that the original depth is preserved. +% This effectively moves the baseline down.} +% \label{fig:margin} +% \end{figure} +% +% \StopEventually{} +% \clearpage +% \section{Implementation} +% \setcounter{lstnumber}{1} +% +% +% \iffalse +%<*trimclip.sty> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesPackage{trimclip}[% +%<!DATE> +%<!VERSION> +%<*DRIVER> + 2099/01/01 develop +%</DRIVER> + Trim and clip general TeX material] +% \end{macrocode} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Options} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \begin{macrocode} +\def\tc@driver{tc-\Gin@driver} +\DeclareOption{pgf}{\def\tc@driver{tc-pgf.def}\AtEndOfPackage{\RequirePackage{pgf}}} +\DeclareOption{pdftex}{\def\tc@driver{tc-pdftex.def}\PassOptionsToPackage{pdftex}{graphicx}} +\DeclareOption{xetex}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}} +\DeclareOption{dvips}{\def\tc@driver{tc-dvips.def}\PassOptionsToPackage{dvips}{graphicx}} +\DeclareOption{dvipdfm}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}} +\DeclareOption{dvipdf}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}} +\DeclareOption*{% + \@ifpackageloaded{graphics}{% + \edef\tc@driver{tc-\CurrentOption.def}% + \begingroup + \edef\@tempa{\CurrentOption.def}% + \ifx\@tempa\Gin@driver\else + \let\on@line\@gobble + \PackageWarning{trimclip}{% + A different clipping driver was requested than the\MessageBreak + one used for 'graphics/x'! This is not recommended\MessageBreak + and can lead to defect output files.% + }% + \fi + \endgroup + }{% + \def\tc@driver{tc-\Gin@driver}% + \PassOptionsToPackage\CurrentOption{graphicx}% + }% +} +\ProcessOptions*\relax +% \end{macrocode} +% +% \begin{macrocode} +\RequirePackage{graphicx}[1999/02/16] +\RequirePackage{collectbox}[2011/08/22] +\RequirePackage{adjcalc} +% \end{macrocode} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{User level and auxiliary macros} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\tc@readvalues} +% Reads the four values for trim, viewport and clip. +% Valid inputs are: +% 4 values directly, +% 1 value which is taken four times, +% 2 values which is taken for left/right and top/bottom. +% \begin{macrocode} +\def\tc@readvalues#1{% + \tc@@readvalues#1 {} {} {} \\% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tc@@readvalues} +% \begin{macrocode} +\def\tc@@readvalues#1 #2 #3 #4 #5\\{% + \adjsetlengthdefault\tc@llx{#1}% + \ifx\@nnil#2\@nnil + \tc@lly\tc@llx + \tc@urx\tc@llx + \tc@ury\tc@llx + \else + \adjsetlengthdefault\tc@lly{#2}% + \ifx\@nnil#3\@nnil + \tc@urx\tc@llx + \tc@ury\tc@lly + \else + \adjsetlengthdefault\tc@urx{#3}% + \adjsetlengthdefault\tc@ury{#4}% + \fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tc@llx} +% \begin{macro}{\tc@lly} +% \begin{macro}{\tc@urx} +% \begin{macro}{\tc@ury} +% Dimension registers for the four trim/viewport values. +% Legend: ll = lower left, ur = upper right. +% \begin{macrocode} +\newdimen\tc@llx +\newdimen\tc@lly +\newdimen\tc@urx +\newdimen\tc@ury +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\trimbox} +% \begin{macrocode} +\newcommand\trimbox{% + \collectboxcheckenv{trimbox}% + \@ifstar + \trimbox@s + \trimbox@ +} +\def\trimbox@#1{% + \collectbox{\@trimclip\@trimbox{#1}}% +} +\def\trimbox@s#1{% + \collectbox{\@trimclip\@viewportbox{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{environment}{trimbox*} +% \begin{macrocode} +\expandafter\newcommand\expandafter*\csname trimbox*\endcsname{% + \@collectboxisenv{trimbox*}% + \trimbox@s +} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\clipbox} +% \begin{macrocode} +\newcommand\clipbox{% + \collectboxcheckenv{clipbox}% + \@ifstar + \clipbox@s + \clipbox@ +} +\def\clipbox@#1{% + \collectbox{\@trimclip\@clipbox{#1}}% +} +\def\clipbox@s#1{% + \collectbox{\@trimclip\@clipvpbox{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{environment}{clipbox*} +% \begin{macrocode} +\expandafter\newcommand\expandafter*\csname clipbox*\endcsname{% + \@collectboxisenv{clipbox*}% + \clipbox@s +} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\marginbox}[1]{Margins as space separated values (like for 'trim')} +% Collect box first. +% \begin{macrocode} +\newcommand\marginbox{% + \collectboxcheckenv{marginbox}% + \@ifstar + \marginbox@s + \marginbox@ +} +\def\marginbox@#1{% + \@collectbox{\@trimclip\@marginbox{#1}}% +} +\def\marginbox@s#1{% + \@collectbox{\@trimclip\@marginraisebox{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{environment}{marginbox*}[1]{Margins as space separated values (like for 'trim')} +% \begin{macrocode} +\expandafter\newcommand\expandafter*\csname marginbox*\endcsname{% + \@collectboxisenv{marginbox*}% + \marginbox@s +} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\@trimclip}[2]{<trim/viewport/clip macro>}{<values>} +% General macro which parses the values and feeds it to the given lower-level macro. +% Finally the box is typeset. This macro will always be used inside a group +% created by \Macro\@collectbox. +% \begin{macrocode} +\def\@trimclip#1#2{% + \tc@readvalues{#2}% + #1% + \collectedbox + \tc@llx + \tc@lly + \tc@urx + \tc@ury + \usebox\collectedbox +} +% \end{macrocode} +% \end{macro} +% +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Low-level commands} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \begin{macro}{\tc@correctbaseline} +% Adjust baseline if required by negative depth or height. +% \begin{macrocode} +\def\tc@correctbaseline#1{% +% \end{macrocode} +% If depth is negative lower the box to get zero depth +% \begin{macrocode} + \ifdim\dp#1<\z@ + \raise\dp#1% + \else +% \end{macrocode} +% Else if height is negative lower the box to get zero height +% \begin{macrocode} + \ifdim\ht#1<\z@ + \lower\ht#1% + \fi\fi + \box#1% +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tc@correctdims} +% Ensure that all dimensions are non-negative. +% \begin{macrocode} +\def\tc@correctdims#1{% + \ifdim\dp#1<\z@ \dp#1=\z@ \fi + \ifdim\wd#1<\z@ \wd#1=\z@ \fi + \ifdim\ht#1<\z@ \ht#1=\z@ \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@trimbox}[5]{<box register>}{<tllx>}{<tlly>}{<turx>}{<tury>} +% Removes the four length for the left, bottom, right and top from the official size of the box register. +% \begin{macrocode} +\def\@trimbox#1#2#3#4#5{% + \setbox#1=\hbox{% + % + \tc@llx=#2\relax + \tc@lly=#3\relax + \advance\tc@lly-\dp#1% + \tc@urx=#4\relax + \advance\tc@urx-\wd#1% + \tc@ury=#5\relax + \advance\tc@ury-\ht#1% + % + % Set dimensions now. + % This allows that the arguments can refer + % to the original dimensions without issues. + \hskip-\tc@llx + \dp#1-\tc@lly + \wd#1-\tc@urx + \ht#1-\tc@ury + % + \tc@correctbaseline{#1}% + }% + \tc@correctdims{#1}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@marginbox} +% Adds the given margins to the depth, width and height. +% The left margin is created by an horizontal skip. +% This implementation assumes that the margins are positive and no special checks are added. +% While negative margins will trim some margin off, this will not lead to correct results if this amounts +% are larger than the existing dimensions. For this the \Macro\@trimbox macro should be used. +% \begin{macrocode} +\def\@marginbox#1#2#3#4#5{% + \setbox#1=\hbox{% + % + \tc@llx=#2\relax + \tc@lly=#3\relax + \advance\tc@lly\dp#1% + \tc@urx=#4\relax + \advance\tc@urx\wd#1% + \tc@ury=#5\relax + \advance\tc@ury\ht#1% + % + % Set dimensions now. + % This allows that the arguments can refer + % to the original dimensions without issues. + \hskip\tc@llx + \dp#1\tc@lly + \wd#1\tc@urx + \ht#1\tc@ury + % + \box#1% + }% + \tc@correctdims{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@marginraisebox} +% Like \Macro\@marginbox but raises the box accordant to the bottom margin, +% so that the original depth is kept. +% \begin{macrocode} +\def\@marginraisebox#1#2#3#4#5{% + \setbox#1=\hbox{% + % + \tc@llx=#2\relax + \tc@lly=#3\relax + \tc@urx=#4\relax + \advance\tc@urx\wd#1% + \tc@ury=#5\relax + \advance\tc@ury\ht#1% + % + % Set dimensions now. + % This allows that the arguments can refer + % to the original dimensions without issues. + \hskip\tc@llx + \wd#1\tc@urx + \ht#1\tc@ury + % Copy original tty values (ury is taken as temp dimension) + \tc@ury=\tc@lly + \advance\tc@lly\dp#1% + \dp#1\tc@lly + % Raise bu original tty value (now in ury) + \raise\tc@ury\box#1% + }% + \tc@correctdims{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@trimbox}[5]{<box register>}{<tllx>}{<tlly>}{<turx>}{<tury>} +% Removes the four length for the left, bottom, right and top from the official size of the box register. +% \begin{macrocode} +\def\@viewportbox#1#2#3#4#5{% + \setbox#1=\hbox{% + % + % Assign values + \tc@llx=#2\relax + \tc@lly=#3\relax + \tc@urx=#4\relax + \tc@ury=#5\relax + % + % Set dimensions now. + % This allows that the arguments can refer + % to the original dimensions without issues. + \hskip-\tc@llx + \dp#1-\tc@lly + \wd#1\tc@urx + \ht#1\tc@ury + % + \tc@correctbaseline{#1}% + }% + \tc@correctdims{#1}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clipbox} +% Clips the box using the given trim amounts. +% For this the box is first trimmed and then clipped to its official size using a driver dependent macro. +% \begin{macrocode} +\def\@clipbox#1#2#3#4#5{% + \@trimbox{#1}{#2}{#3}{#4}{#5}% + \@cliptoboxdim{#1}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@clipvpbox} +% Clips the box using the given trim amounts. +% For this the box is first trimmed and then clipped to its official size using a driver dependent macro. +% \begin{macrocode} +\def\@clipvpbox#1#2#3#4#5{% + \@viewportbox{#1}{#2}{#3}{#4}{#5}% + \@cliptoboxdim{#1}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Driver loading} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The clipping support is output driver dependent. The driver selected by \pkg{graphics} is used and a definition file +% is used if its exists. Otherwise either the default \texttt{pdftex} implementation or the \pkg{pgf} fall-back driver +% is used. +% +% +% +% \begin{macro}{\tc@bezfacn} +% The Bezier factor required to draw rounded corners in same drivers. +% \begin{macrocode} +\def\tc@bezfacn{0.44771525}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\InputIfFileExists{\tc@driver}{% + {\let\on@line\@gobble + \PackageInfo{trimclip}{Using driver '\tc@driver'.}}% +}{% + \input{tc-pgf.def}% + {\let\on@line\@gobble + \PackageInfo{trimclip}{No clipping driver '\tc@driver' available.\MessageBreak Using fall-back PGF driver.}}% +} +% \end{macrocode} +% +% +% \iffalse +%</trimclip.sty> +% \fi +% +% \subsection{Driver files} +% +% \subsubsection{PGF fall-back driver} +% \iffalse +%<*tc-pgf.def> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesFile{tc-pgf.def}[2019/01/04 v2.2 trimclip fall-back clipping driver using PGF] +% \end{macrocode} +% +% \begin{macrocode} +\RequirePackage{pgf} +% \end{macrocode} +% +% \begin{macro}{\@cliptoboxdim} +% Clips to official box dimension. +% \begin{macrocode} +\def\@cliptoboxdim#1{% + \setbox#1\hbox{\begin{pgfpicture}% + \pgfpathmoveto{\pgfqpoint\z@{-\dp#1}}% + \pgfpathlineto{\pgfqpoint\z@{\ht#1}}% + \pgfpathlineto{\pgfqpoint{\wd#1}{\ht#1}}% + \pgfpathlineto{\pgfqpoint{\wd#1}{-\dp#1}}% + \pgfpathclose + \pgfusepathqclip + \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}% + \pgfnode{rectangle}{base west}{\usebox#1}{}{}% + \pgfsetbaselinepointnow{\pgfpoint\z@\z@}% + \end{pgfpicture}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% Clips round corners off. +% \begin{macrocode} +\def\@clipcornersofbox#1#2#3#4#5{% + \setbox#1\hbox{\begin{pgfpicture}% + \pgfpathmoveto{\pgfpoint{\z@}{\ht#1-#2}}% + \pgfpatharc{180}{90}{#2}% + \pgfpathlineto{\pgfpoint{\wd#1-#3}{\ht#1}}% + \pgfpatharc{90}{0}{#3}% + \pgfpathlineto{\pgfpoint{\wd#1}{#5-\dp#1}}% + \pgfpatharc{0}{-90}{#5}% + \pgfpathlineto{\pgfpoint{#4}{-\dp#1}}% + \pgfpatharc{270}{180}{#4}% + \pgfpathlineto{\pgfpoint{\z@}{\ht#1-#2}}% + \pgfpathclose + \pgfusepathqclip + \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}% + \pgfnode{rectangle}{base west}{\usebox#1}{}{}% + \pgfsetbaselinepointnow{\pgfpoint\z@\z@}% + \end{pgfpicture}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>} +% Round frame around a box. +% \begin{macrocode} +\def\@rndframearoundbox#1#2#3#4#5#6{% + \setbox#1\hbox{\begin{pgfpicture}% + \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% + \edef\@tempa{#6}% + \ifx\@empty\@tempa\else + \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}% + \fi + \pgfset{inner sep=\z@,outer sep=\z@,minimum size=\z@}% + \pgfnode{rectangle}{base west}{\usebox#1}{}{}% + \pgfusepath{}% + \adjbox@rndframe@color + \pgfpathmoveto{\pgfpoint{\z@}{\ht#1-#2}}% + \pgfpatharc{180}{90}{#2}% + \pgfpathlineto{\pgfpoint{\wd#1-#3}{\ht#1}}% + \pgfpatharc{90}{0}{#3}% + \pgfpathlineto{\pgfpoint{\wd#1}{#5-\dp#1}}% + \pgfpatharc{0}{-90}{#5}% + \pgfpathlineto{\pgfpoint{#4}{-\dp#1}}% + \pgfpatharc{270}{180}{#4}% + \pgfpathlineto{\pgfpoint{\z@}{\ht#1-#2}}% + \pgfpathclose + \pgfusepath{stroke}% + \pgfsetbaselinepointnow{\pgfpoint\z@\z@}% + \end{pgfpicture}}% +} +% \end{macrocode} +% \end{macro} +% +%^^A vim: ft=tex +% \iffalse +%</tc-pgf.def> +% \fi +% +% \subsubsection{pdftex driver} +% \iffalse +%<*tc-pdftex.def> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesFile{tc-pdftex.def}[2019/01/04 v2.2 Clipping driver for pdftex] +% \end{macrocode} +% +% \begin{macro}{\@cliptoboxdim} +% Clips to official box dimension. +% +% Uses now \Macro\pdfliteral because \Macro\pdfxform does not support +% transparencies and patterns with TikZ. +% \begin{macrocode} +\def\@cliptoboxdim#1{% + \setbox#1=\hbox{% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\DEPTH{\dp#1}% + \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}% + \pdfsave + \pdfliteral direct {% + 0 -\DEPTH\space \WIDTH\space \TOTALHEIGHT\space re W n + }% + \hbox to 0pt{\copy#1\hss}% + \pdfrestore + \hskip\wd#1 + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clip@bpdimens}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% \begin{macrocode} +\def\@clip@bpdimens#1#2#3#4#5{% + \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}% + \adjcalc@settobp\HEIGHT{\ht#1}% + \adjcalc@settobp\DEPTH{-\dp#1}% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\RADIUSTL{#2}% + \adjcalc@settobp\RADIUSTR{#3}% + \adjcalc@settobp\RADIUSBR{#5}% + \adjcalc@settobp\RADIUSBL{#4}% + \adjcalc@settobp\RADIUSTLb{\tc@bezfacn#2}% + \adjcalc@settobp\HEIGHTmRADIUSTL{\ht#1-#2}% + \adjcalc@settobp\HEIGHTmRADIUSTLb{\ht#1-\tc@bezfacn#2}% + \adjcalc@settobp\HEIGHTmRADIUSTR{\ht#1-#3}% + \adjcalc@settobp\HEIGHTmRADIUSTRb{\ht#1-\tc@bezfacn#3}% + \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}% + \adjcalc@settobp\WIDTHmRADIUSTRb{\wd#1-\tc@bezfacn#3}% + \adjcalc@settobp\RADIUSBRmDEPTH{#5-\dp#1}% + \adjcalc@settobp\RADIUSBRmDEPTHb{\tc@bezfacn#5-\dp#1}% + \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}% + \adjcalc@settobp\WIDTHmRADIUSBRb{\wd#1-\tc@bezfacn#5}% + \adjcalc@settobp\RADIUSBLmDEPTH{#4-\dp#1}% + \adjcalc@settobp\RADIUSBLmDEPTHb{\tc@bezfacn#4-\dp#1}% + \adjcalc@settobp\RADIUSBLb{\tc@bezfacn#4}% + \adjcalc@settobp\LINEWIDTH{\fboxrule}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clip@roundedbox@pdfcode} +% \begin{macrocode} +\def\@clip@roundedboxpath@pdfcode{% + 0 \HEIGHTmRADIUSTL m + 0 \HEIGHTmRADIUSTLb \RADIUSTLb \HEIGHT \RADIUSTL \HEIGHT c + \WIDTHmRADIUSTR \HEIGHT l + \WIDTHmRADIUSTRb \HEIGHT \WIDTH \HEIGHTmRADIUSTRb \WIDTH \HEIGHTmRADIUSTR c + \WIDTH \RADIUSBRmDEPTH l + \WIDTH \RADIUSBRmDEPTHb \WIDTHmRADIUSBRb \DEPTH \WIDTHmRADIUSBR \DEPTH c + \RADIUSBL \DEPTH l + \RADIUSBLb \DEPTH 0 \RADIUSBLmDEPTHb 0 \RADIUSBLmDEPTH c + 0 \RADIUSBLmDEPTH l +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% Clips round corners off. +% \begin{macrocode} +\def\@clipcornersofbox#1#2#3#4#5{% + \setbox#1=\hbox{% + \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}% + \pdfsave + \pdfliteral direct {% + \@clip@roundedboxpath@pdfcode + h W n + }% + \hbox to 0pt{\copy#1\hss}% + \pdfrestore + \hskip\wd#1% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>} +% Round frame around a box. +% \begin{macrocode} +\def\@rndframearoundbox#1#2#3#4#5#6{% + \setbox#1=\hbox{% + \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% + \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}% + \edef\@tempa{#6}% + \ifx\@empty\@tempa\else + \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}% + \fi + % + \hbox to 0pt{\copy#1\hss}% + \pdfsave + \hbox to 0pt{% + \color@setgroup + \adjbox@rndframe@color + \pdfliteral direct {% + \LINEWIDTH w + \@clip@roundedboxpath@pdfcode + h s + }% + \color@endgroup + }% + \pdfrestore + \hskip\wd#1% + }% + \adjsetlength\@tempdima{.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% +} +% \end{macrocode} +% \end{macro} +% +% +%^^A vim: ft=tex +% \iffalse +%</tc-pdftex.def> +% \fi +% +% \subsubsection{dvips driver} +% \iffalse +%<*tc-dvips.def> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesFile{tc-dvips.def}[2019/01/04 v2.2 Clipping driver for dvips] +% \end{macrocode} +% +% \begin{macro}{\@cliptoboxdim}[1]{box register to clip} +% Clips to official box dimension. +% +% The following clipping code was suggested by +% Joseph Wright (LaTeX3 project), but slightly modified +% for this package. +% \begin{macrocode} +\def\@cliptoboxdim#1{% + \setbox#1=\hbox{% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\DEPTH{\dp#1}% + \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}% + \special{% + ps: + /mtrxc matrix currentmatrix def + currentpoint gsave + translate + Resolution 72 div VResolution 72 div + scale + newpath + 0 \DEPTH \WIDTH \TOTALHEIGHT rectclip + newpath + mtrxc setmatrix + }% + \hbox to 0pt{\copy#1\hss}% + \special{ps: grestore }% + \hskip\wd#1% + }% +} +% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% Clips round corners off. +% \begin{macrocode} +\def\@clipcornersofbox#1#2#3#4#5{% + \setbox#1=\hbox{% + \adjcalc@settobp\DEPTHmRADIUSBL\@tempdima + \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}% + \adjcalc@settobp\HEIGHT{-\ht#1}% + \adjcalc@settobp\DEPTH{\dp#1}% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\RADIUSTL{#2}% + \adjcalc@settobp\RADIUSTR{#3}% + \adjcalc@settobp\RADIUSBL{#4}% + \adjcalc@settobp\RADIUSBR{#5}% + \adjcalc@settobp\RADIUSTLmHEIGHT{#2-\ht#1}% + \adjcalc@settobp\RADIUSTRmHEIGHT{#3-\ht#1}% + \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}% + \adjcalc@settobp\DEPTHmRADIUSBR{\dp#1-#5}% + \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}% + \adjcalc@settobp\DEPTHmRADIUSBL{\dp#1-#4}% + \special{% + ps: + /mtrxc matrix currentmatrix def + currentpoint gsave + translate + Resolution 72 div VResolution 72 div + scale + newpath + %0 \DEPTH neg translate + %0 \DEPTH \WIDTH \TOTALHEIGHT rectclip + 0 \RADIUSTLmHEIGHT\space moveto + \RADIUSTL\space \RADIUSTLmHEIGHT\space \RADIUSTL\space 180 -90 arc + \WIDTHmRADIUSTR\space \HEIGHT\space lineto + \WIDTHmRADIUSTR\space \RADIUSTRmHEIGHT\space \RADIUSTR\space -90 0 arc + \WIDTH\space \DEPTHmRADIUSBR\space lineto + \WIDTHmRADIUSBR\space \DEPTHmRADIUSBR\space \RADIUSBR\space 0 90 arc + \RADIUSBL\space \DEPTH\space lineto + \RADIUSBL\space \DEPTHmRADIUSBL\space \RADIUSBL\space -270 -180 arc + closepath + %gsave 0.5 0 0 setrgbcolor stroke grestore + clip + newpath + mtrxc setmatrix + }% + \hbox to 0pt{\copy#1\hss}% + \special{ps: grestore }% + \hskip \wd#1% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>} +% Clips round corners off. +% \begin{macrocode} +\def\@rndframearoundbox#1#2#3#4#5#6{% + \setbox#1=\hbox{% + \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% + \adjcalc@settobp\TOTALHEIGHT{-\ht#1-\dp#1}% + \adjcalc@settobp\HEIGHT{-\ht#1}% + \adjcalc@settobp\DEPTH{\dp#1}% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\RADIUSTL{#2}% + \adjcalc@settobp\RADIUSTR{#3}% + \adjcalc@settobp\RADIUSBR{#5}% + \adjcalc@settobp\RADIUSBL{#4}% + \adjcalc@settobp\RADIUSTLmHEIGHT{#2-\ht#1}% + \adjcalc@settobp\RADIUSTRmHEIGHT{#3-\ht#1}% + \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}% + \adjcalc@settobp\DEPTHmRADIUSBR{\dp#1-#5}% + \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}% + \adjcalc@settobp\DEPTHmRADIUSBL{\dp#1-#4}% + \adjcalc@settobp\LINEWIDTH{\fboxrule}% + \edef\@tempa{#6}% + \ifx\@empty\@tempa\else + \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}% + \fi + % + \hbox to 0pt{\copy#1\hss}% + \hbox to 0pt{% + \color@setgroup + \adjbox@rndframe@color + \special{% + ps: + /mtrxc matrix currentmatrix def + currentpoint gsave + translate + Resolution 72 div VResolution 72 div + scale + newpath + %0 \DEPTH neg translate + %0 \DEPTH \WIDTH \TOTALHEIGHT rectclip + 0 \RADIUSTLmHEIGHT moveto + \RADIUSTL \RADIUSTLmHEIGHT \RADIUSTL 180 -90 arc + \WIDTHmRADIUSTR \HEIGHT lineto + \WIDTHmRADIUSTR \RADIUSTRmHEIGHT \RADIUSTR -90 0 arc + \WIDTH \DEPTHmRADIUSBR lineto + \WIDTHmRADIUSBR \DEPTHmRADIUSBR \RADIUSBR 0 90 arc + \RADIUSBL \DEPTH lineto + \RADIUSBL \DEPTHmRADIUSBL \RADIUSBL -270 -180 arc + closepath + \LINEWIDTH setlinewidth + stroke + newpath + mtrxc setmatrix + grestore + }% + \color@endgroup + }% + \hskip \wd#1% + }% + \adjsetlength\@tempdima{.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% +} +% \end{macrocode} +% \end{macro} +% +%^^A vim: ft=tex +% \iffalse +%</tc-dvips.def> +% \fi +% +% \subsubsection{xetex driver} +% \iffalse +%<*tc-xetex.def> +% \fi +% \begin{macrocode} +%<!COPYRIGHT> +\ProvidesFile{tc-xetex.def}[2019/01/04 v2.2 Clipping driver for xetex] +% \end{macrocode} +% +% \begin{macro}{\@cliptoboxdim} +% Clips to official box dimension. +% +% The following clipping code was suggested by +% Joseph Wright (LaTeX3 project), but slightly modified +% for this package. +% \begin{macrocode} +\def\@cliptoboxdim#1{% + \setbox#1=\hbox{% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\DEPTH{\dp#1}% + \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}% + \special{pdf:content q }% + \special{pdf:code 0 -\DEPTH \WIDTH \TOTALHEIGHT re W n }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \special{pdf:content q }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \hbox to 0 pt{\copy#1\hss}% + \special{pdf:literal direct Q }% + \special{pdf:literal direct Q }% + \hskip\wd#1% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clip@bpdimens}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% \begin{macrocode} +\def\@clip@bpdimens#1#2#3#4#5{% + \adjcalc@settobp\TOTALHEIGHT{\ht#1+\dp#1}% + \adjcalc@settobp\HEIGHT{\ht#1}% + \adjcalc@settobp\DEPTH{-\dp#1}% + \adjcalc@settobp\WIDTH{\wd#1}% + \adjcalc@settobp\RADIUSTL{#2}% + \adjcalc@settobp\RADIUSTR{#3}% + \adjcalc@settobp\RADIUSBL{#4}% + \adjcalc@settobp\RADIUSBR{#5}% + \adjcalc@settobp\RADIUSTLb{\tc@bezfacn#2}% + \adjcalc@settobp\HEIGHTmRADIUSTL{\ht#1-#2}% + \adjcalc@settobp\HEIGHTmRADIUSTLb{\ht#1-\tc@bezfacn#2}% + \adjcalc@settobp\HEIGHTmRADIUSTR{\ht#1-#3}% + \adjcalc@settobp\HEIGHTmRADIUSTRb{\ht#1-\tc@bezfacn#3}% + \adjcalc@settobp\WIDTHmRADIUSTR{\wd#1-#3}% + \adjcalc@settobp\WIDTHmRADIUSTRb{\wd#1-\tc@bezfacn#3}% + \adjcalc@settobp\RADIUSBRmDEPTH{#5-\dp#1}% + \adjcalc@settobp\RADIUSBRmDEPTHb{\tc@bezfacn#5-\dp#1}% + \adjcalc@settobp\WIDTHmRADIUSBR{\wd#1-#5}% + \adjcalc@settobp\WIDTHmRADIUSBRb{\wd#1-\tc@bezfacn#5}% + \adjcalc@settobp\RADIUSBLmDEPTH{#4-\dp#1}% + \adjcalc@settobp\RADIUSBLmDEPTHb{\tc@bezfacn#4-\dp#1}% + \adjcalc@settobp\RADIUSBLb{\tc@bezfacn#4}% + \adjcalc@settobp\LINEWIDTH{\fboxrule}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@clip@roundedbox@pdfcode} +% \begin{macrocode} +\def\@clip@roundedboxpath@pdfcode{% + 0 \HEIGHTmRADIUSTL m + 0 \HEIGHTmRADIUSTLb \RADIUSTLb \HEIGHT \RADIUSTL \HEIGHT c + \WIDTHmRADIUSTR \HEIGHT l + \WIDTHmRADIUSTRb \HEIGHT \WIDTH \HEIGHTmRADIUSTRb \WIDTH \HEIGHTmRADIUSTR c + \WIDTH \RADIUSBRmDEPTH l + \WIDTH \RADIUSBRmDEPTHb \WIDTHmRADIUSBRb \DEPTH \WIDTHmRADIUSBR \DEPTH c + \RADIUSBL \DEPTH l + \RADIUSBLb \DEPTH 0 \RADIUSBLmDEPTHb 0 \RADIUSBLmDEPTH c + 0 \RADIUSBLmDEPTH l +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@clipcornersofbox}[5]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>} +% Clips round corners off. +% \begin{macrocode} +\def\@clipcornersofbox#1#2#3#4#5{% + \setbox#1=\hbox{% + \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}% + \special{pdf:content q }% + \special{pdf:literal direct + \@clip@roundedboxpath@pdfcode + h W n + }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \special{pdf:content q }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \hbox to 0pt{\copy#1\hss}% + \special{pdf:literal direct Q }% + \special{pdf:literal direct Q }% + \hskip\wd#1% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@rndframearoundbox}[6]{<box register}{<upper left>}{<upper right>}{<lower left>}{<lower right>}{<clip>} +% Round frame around a box. +% \begin{macrocode} +\def\@rndframearoundbox#1#2#3#4#5#6{% + \setbox#1=\hbox{% + \adjsetlength\@tempdima{\fboxsep+.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% + \@clip@bpdimens{#1}{#2}{#3}{#4}{#5}% + \edef\@tempa{#6}% + \ifx\@empty\@tempa\else + \@clipcornersofbox{#1}{#2}{#3}{#4}{#5}% + \fi + % + \hbox to 0pt{\copy#1\hss}% + \hbox to 0pt{% + \color@setgroup + \adjbox@rndframe@color + \special{pdf:content q }% + \special{pdf:literal direct + \LINEWIDTH w + \@clip@roundedboxpath@pdfcode + h s + }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \special{pdf:content q }% + \special{pdf:literal direct -1 0 0 -1 0 0 cm }% + \special{pdf:literal direct Q }% + \special{pdf:literal direct Q }% + \color@endgroup + }% + \hskip\wd#1% + }% + \adjsetlength\@tempdima{.5\fboxrule}% + \@marginbox#1\@tempdima\@tempdima\@tempdima\@tempdima% +} +% \end{macrocode} +% \end{macro} +% +%^^A vim: ft=tex +% \iffalse +%</tc-xetex.def> +% \fi +% +% \Finale +% \endinput +% +% ^^A Standalone figures: +% +% \iffalse +%<*box.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 +\begin{tikzpicture}[font=\sffamily,>=latex] + \newcommand\Cs[1]{\texttt{\scriptsize\textbackslash #1}} +% Save example text in box + \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture} + \def\HEIGHT{\ht\mybox} + \def\WIDTH{\wd\mybox} + \def\DEPTH{\dp\mybox} +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0) node [above,midway] {baseline}; +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); + \draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \tikzset{inner sep=5pt} + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [pos=1.1,left,align=left] + {depth\\\Cs{depth}\\\Cs{dp}\Cs{br}}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [pos=.4,left,align=left] + {height\\\Cs{height}\\\Cs{ht}\Cs{br}}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right,align=left] + {totalheight\\\Cs{totalheight}}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below,align=left] + {width\\\Cs{width}\\\Cs{wd}\Cs{br}}; + \fill (-2.5ex,0) circle (.5pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</box.tex> +% \fi +% +% \iffalse +%<*compare.tex> +% \fi +\documentclass{article} +\usepackage[margin=1cm,paperwidth=20cm,paperheight=100cm]{geometry} +\usepackage[]{xcolor} +\usepackage[export]{adjustbox} +%\listfiles +\fboxsep=0pt +\parskip=1cm + +\usepackage[tightpage]{preview} + +\usepackage{standalone} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{tikz} +\newdimen\unit +\tikzset{unit/.code={\unit=\dimexpr#1\relax}} +\tikzset{xy/.style={x={#1},y={#1},unit={#1},font={\sffamily\fontsize{.2\unit}{.24\unit}\selectfont},line width=.01\unit}} + +\def\showdiff#1{% + {% + \diff=\dimexpr#10-#11\relax + \pgfmathsetlength\absdiff{abs(\diff)}% + \ifdim\diff=0pt% + \textcolor{green}{PASSED}% + \else + \ifdim\absdiff<\Epsilon + \pgfmathtruncatemacro\FCOLOR{100*(\Epsilon-abs(\absdiff))/\Epsilon}% + \textcolor{green!\FCOLOR!yellow}{OK: \the\diff}% + \else + \textcolor{red}{FAILED: \the\diff}% + \fi + \fi + \quad + \ifdim#11=0pt + \diff=#10 + \else + \pgfmathsetlength\diff{(#10/#11) - 1pt} + \fi + \ifdim\diff<0pt + \absdiff=-\diff + \else + \absdiff=\diff + \fi + \ifdim\diff=0pt% + \textcolor{green}{PASSED}% + \else + \ifdim\absdiff<\dEpsilon + \pgfmathtruncatemacro\FCOLOR{100*(\dEpsilon-abs(\absdiff))/\dEpsilon}% + \textcolor{green!\FCOLOR!yellow}{OK: \the\diff}% + \else + \textcolor{red}{FAILED: \the\diff}% + \fi + \fi + }% +} + +\newlength\diff +\newlength\absdiff +\newlength\Epsilon +\newlength\dEpsilon +\Epsilon=0.05pt +\dEpsilon=0.001pt +\def\test#1#2{% + \begin{preview}% + \sbox0{\includegraphics[#1]{#2}}% + \sbox1{\adjustbox{#1}{\input{#2}\unskip}}% + \begin{tabular}{ll@{}l} + \usebox0 & \usebox1 & .\\ + \the\ht0 & \the\ht1 & \showdiff\ht \\ + \the\dp0 & \the\dp1 & \showdiff\dp \\ + \the\wd0 & \the\wd1 & \showdiff\wd \\ + \end{tabular}% + \end{preview}% +} + +\begin{document} +\ttfamily + +\test{}{gridbp} + +\test{}{gridpt} + +\test{clip,trim=10bp 20bp 0 0,width=177bp,frame=1pt 1pt}{gridbp} + +\test{clip,trim=10pt 20pt 0 0,width=177pt,frame=1pt 1pt}{gridpt} + +\test{angle=45,clip,trim=10bp 0 0 0,width=177bp,totalheight=5cm,frame}{gridbp} + +\test{clip,trim=10pt 0 0 0,angle=90,trim=5pt 0 0 0}{gridbp} + +\test{angle=180,totalheight=5cm}{gridbp} + +\test{width=3cm,angle=0,totalheight=5cm}{gridbp} + +\test{width=3cm,totalheight=5cm,angle=180}{gridbp} + +\test{width=3cm,totalheight=5cm}{gridbp} + +\test{margin=.5cm .5cm .5cm .5cm,frame}{gridbp} +\end{document} + +\test{width=2cm, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame,angle=5, +margin=.1cm .1cm .1cm .1cm,frame +}{gridbp} + +\test{width=2cm, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +margin=1pt 1pt 1pt 1pt,frame,angle=1, +}{gridbp} + + +\end{document} + +\adjustbox{width=2cm,trim={.5\WIDTH} 0 0 0,frame}{Ag} +% \iffalse +%</compare.tex> +% \fi +% +% \iffalse +%<*margin2.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 +\begin{tikzpicture}[font=\sffamily,>=latex] +% Save example text in box + \def\text{\scalebox{10}{Xy}} + \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture} + \def\HEIGHT{\ht\mybox} + \def\WIDTH{\wd\mybox} + \def\DEPTH{\dp\mybox} + \def\LLX{.15\WIDTH} + \def\LLY{.5\DEPTH} + \def\URX{.15\WIDTH} + \def\URY{.25\HEIGHT} +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \begin{scope}[blue,every node/.append style={inner sep=2pt}] + \begin{scope} + \draw ([shift={(-\LLX,-\LLY)}]0,-\DEPTH) rectangle ([shift={(\URX,\URY)}]\WIDTH,\HEIGHT); +%\node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} +%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY); +%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY); + \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly}; + \draw [->] (0,.5*\HEIGHT-.5*\DEPTH) -- ++(-\LLX,0) node [above,midway] {\scriptsize llx}; + \draw [->] (.5\WIDTH,\HEIGHT) -- ++(0,\URY) node [right,midway] {\scriptsize ury}; + \draw [->] (\WIDTH,.5*\HEIGHT-.5*\DEPTH) -- ++(\URX,0) node [above,midway] {\scriptsize urx}; + \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly}; + \draw (-\LLX,-\LLY) -- ([shift={(+\URX,0)}]\WIDTH,-\LLY); + \path [fill=white,draw] (-\LLX,-\LLY) circle (1pt); + \draw [->] (.5\WIDTH,0pt) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly}; + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</margin2.tex> +% \fi +% +% \iffalse +%<*margin.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\newsavebox\mybox + +\begin{document} +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 +%</standalone> +\begin{tikzpicture}[font=\sffamily,>=latex] +% Save example text in box + \def\text{\scalebox{10}{Xy}} + \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture} + \def\HEIGHT{\ht\mybox} + \def\WIDTH{\wd\mybox} + \def\DEPTH{\dp\mybox} + \def\LLX{.15\WIDTH} + \def\LLY{.5\DEPTH} + \def\URX{.15\WIDTH} + \def\URY{.25\HEIGHT} +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \begin{scope}[blue,every node/.append style={inner sep=2pt}] + \begin{scope} + \draw ([shift={(-\LLX,-\LLY)}]0,-\DEPTH) rectangle ([shift={(\URX,\URY)}]\WIDTH,\HEIGHT); +%\node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} +%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY); +%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY); + \draw [->] (.5\WIDTH,-\DEPTH) -- ++(0,-\LLY) node [right,midway] {\scriptsize lly}; + \draw [->] (0,.5*\HEIGHT-.5*\DEPTH) -- ++(-\LLX,0) node [above,midway] {\scriptsize llx}; + \draw (-\LLX,0) -- ([shift={(+\URX,0)}]\WIDTH,0); + \draw [->] (.5\WIDTH,\HEIGHT) -- ++(0,\URY) node [right,midway] {\scriptsize ury}; + \draw [->] (\WIDTH,.5*\HEIGHT-.5*\DEPTH) -- ++(\URX,0) node [above,midway] {\scriptsize urx}; + \path [fill=white,draw] (-\LLX,0) circle (1pt); + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</margin.tex> +% \fi +% +% \iffalse +%<*trim2.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\usepackage{adjustbox} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 + +% Save example text in box +\def\text{\sffamily\scalebox{10}{Xy}} +\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}} +\def\HEIGHT{\ht\mybox} +\def\WIDTH{\wd\mybox} +\def\DEPTH{\dp\mybox} +\def\LLX{.15\WIDTH} +\def\LLY{\DEPTH+.15\HEIGHT} +\def\URX{.15\WIDTH} +\def\URY{.25\HEIGHT} +% +%\usebox\mybox +%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}} +\begin{tikzpicture}[font=\sffamily,>=latex] +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width}; + \fill (-2.5ex,0) circle (.5pt); + \begin{scope}[blue] %,every node/.append style={inner sep=2pt}] + \begin{scope} + \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} +%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY); +%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY); + \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly}; + \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx}; + \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY); + \draw [->] (\LLX+.2\WIDTH,-\DEPTH+\LLY) -- (\LLX+.2\WIDTH,0) node [right,midway] {\scriptsize moves down}; + \path [fill=white,draw] (\LLX,-\DEPTH+\LLY) circle (1pt); + \draw [->] + ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [left,midway] {\scriptsize ury} + ; + \draw [->] + ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [below,midway] {\scriptsize urx} + ; + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</trim2.tex> +% \fi +% +% \iffalse +%<*trim3.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\usepackage{adjustbox} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 + +% Save example text in box +\def\text{\sffamily\scalebox{10}{Xy}} +\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}} +\def\HEIGHT{\ht\mybox} +\def\WIDTH{\wd\mybox} +\def\DEPTH{\dp\mybox} +\def\LLX{.15\WIDTH} +\def\LLY{.4\DEPTH} +\def\URX{.15\WIDTH} +\def\URY{(\HEIGHT+.25\DEPTH)} +% +%\leavevmode +%\rlap{\hbox to \wd\mybox{\hrulefill}}\usebox\mybox +%\rlap{\hbox to \wd\mybox{\hrulefill}}\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}} +%\sbox0{\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}}}% +%ht=\the\ht0, dp=\the\dp0, wd=\the\wd0 +\begin{tikzpicture}[font=\sffamily,>=latex] +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width}; + \fill (-2.5ex,0) circle (.5pt); + \begin{scope}[blue] %,every node/.append style={inner sep=2pt}] + \begin{scope} + \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} +%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,{-\URY}); +%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY); + \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly}; + \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx}; + \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY); + \draw [->] (\LLX+.2\WIDTH,{\HEIGHT-\URY}) -- (\LLX+.2\WIDTH,0) node [pos=0.4,below right] {\scriptsize moves up}; + \path [fill=white,draw] (\LLX,{\HEIGHT-\URY}) circle (1pt); + \draw [->] + ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [left,midway] {\scriptsize ury} + ; + \draw [->] + ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [below,midway] {\scriptsize urx} + ; + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</trim3.tex> +% \fi +% +% \iffalse +%<*trim.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 +\begin{tikzpicture}[font=\sffamily,>=latex] +% Save example text in box + \def\text{\scalebox{10}{Xy}} + \sbox\mybox{\pgfinterruptpicture\sffamily\color{black!25}\scalebox{10}{Xy}\endpgfinterruptpicture} + \def\HEIGHT{\ht\mybox} + \def\WIDTH{\wd\mybox} + \def\DEPTH{\dp\mybox} + \def\LLX{.15\WIDTH} + \def\LLY{.5\DEPTH} + \def\URX{.15\WIDTH} + \def\URY{.25\HEIGHT} +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width}; + \fill (-2.5ex,0) circle (.5pt); + \begin{scope}[blue,every node/.append style={inner sep=2pt}] + \begin{scope} + \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} +%\draw [->,.!45] (\WIDTH,\HEIGHT) -- ++(-\URX,-\URY); +%\draw [->,.!45] (0,-\DEPTH) -- ++(\LLX,\LLY); + \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \draw [->] (\LLX,-\DEPTH) -- ++(0,\LLY) node [right,midway] {\scriptsize lly}; + \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx}; + \draw (\LLX,0) -- ([shift={(-\URX,0)}]\WIDTH,0); + \draw [->] + ([shift={(-\URX,0)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [left,midway] {\scriptsize ury} + ; + \draw [->] + ([shift={(0,-\URY)}]\WIDTH,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [below,midway] {\scriptsize urx} + ; + \path [fill=white,draw] (\LLX,0) circle (1pt); + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</trim.tex> +% \fi +% +% \iffalse +%<*viewport2.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\usepackage{adjustbox} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 + +% Save example text in box +\def\text{\sffamily\scalebox{10}{Xy}} +\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}} +\def\HEIGHT{\ht\mybox} +\def\WIDTH{\wd\mybox} +\def\DEPTH{\dp\mybox} +\def\LLX{.15\WIDTH} +\def\LLY{\DEPTH-.15\HEIGHT} +\def\URX{.15\WIDTH} +\def\URY{.25\HEIGHT} +% +%\usebox\mybox +%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}} +\begin{tikzpicture}[font=\sffamily,>=latex] +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width}; + \fill (-2.5ex,0) circle (.5pt); + \begin{scope}[blue] + \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} + \begin{scope}[blue] + \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \draw (\LLX,0) -- ([shift={(-\URX,0)}]\WIDTH,0); + \path [fill=white,draw] (\LLX,0) circle (1pt); + \end{scope} + \begin{scope}[blue!50!black] %,every node/.append style={inner sep=2pt}] +%\draw [->,.!45] (0,0) -- ++(-\URX+\WIDTH,-\URY+\HEIGHT); +%\draw [->,.!45] (0,0) -- ++(\LLX,\LLY-\DEPTH); + \draw [->] (\LLX,0) -- (\LLX,\LLY-\DEPTH) node [right,midway] {\scriptsize lly}; + \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx}; + \draw [->] + ([shift={(-\URX,0)}]\WIDTH,0) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [right,midway] {\scriptsize ury} + ; + \draw [->] + ([shift={(0,-\URY)}]0,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [above,midway] {\scriptsize urx} + ; + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</viewport2.tex> +% \fi +% +% \iffalse +%<*viewport.tex> +% \fi +%<*standalone> +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{calc} +\usepackage{adjustbox} +\newsavebox\mybox + +\begin{document} +%</standalone> +% Diagram of the TeX box model and its dimensions +% Copyright (C) 2001 by Martin Scharrer <martin@scharrer.me>, Nov 12th 2011 +% This is free code under the LPPL v1.3 or later version OR the CC BY-SA 3.0 + +% Save example text in box +\def\text{\sffamily\scalebox{10}{Xy}} +\sbox\mybox{\sffamily\color{black!25}\scalebox{10}{Xy}} +\def\HEIGHT{\ht\mybox} +\def\WIDTH{\wd\mybox} +\def\DEPTH{\dp\mybox} +\def\LLX{.15\WIDTH} +\def\LLY{\DEPTH+.15\HEIGHT} +\def\URX{.15\WIDTH} +\def\URY{.25\HEIGHT} +% +%\usebox\mybox +%\rlap{\trimbox{{\LLX} {\LLY} {\URX} {\URY}}{\usebox\mybox}}\clipbox{{\LLX} {\LLY} {\URX} {\URY}}{\color{blue}{\text}} +\begin{tikzpicture}[font=\sffamily,>=latex] +% Extensions lines for dimensions (drawn here to be below other material) + \draw [gray,thin] + (0,0) -- +(-3.5ex,0) + (0,\HEIGHT) -- +(-3.5ex,0) + (0,-\DEPTH) -- +(-3.5ex,0) + (\WIDTH,\HEIGHT) -- +(3.5ex,0) + (\WIDTH,-\DEPTH) -- +(3.5ex,0) + (0,-\DEPTH) -- +(0,-3.5ex) + (\WIDTH,-\DEPTH) -- +(0,-3.5ex) + ; +% Text node: + \node [inner sep=0pt,anchor=base west] {\usebox\mybox}; +% Baseline + \draw (0,0) -- (\WIDTH,0);% node [above,midway] {baseline}; +%\draw [<-,shorten <=2pt] (0,0) -- (2ex,-2ex) -- +(.5ex,0) node [right=-0.5ex] {origin}; +% Dimensions + \draw [->] (-2.5ex,0) -- +(0,-\DEPTH) node [midway,left] {depth}; + \draw [->] (-2.5ex,0) -- +(0, \HEIGHT) node [midway,left] {height}; + \draw [<->] (\WIDTH,-\DEPTH) ++(2.5ex,0) -- +(0,\DEPTH+\HEIGHT) node [midway,right] {totalheight}; + \draw [<->] (0,-\DEPTH) ++(0,-2.5ex) -- +(\WIDTH,0) node [midway,below] {width}; + \fill (-2.5ex,0) circle (.5pt); + \begin{scope}[blue] + \clip ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \node [inner sep=0pt,anchor=base west,color=blue!50!white] {\text}; + \end{scope} + \begin{scope}[blue] +%\draw [->,.!45] (0,0) -- ++(-\URX+\WIDTH,-\URY+\HEIGHT); +%\draw [->,.!45] (0,0) -- ++(\LLX,\LLY-\DEPTH); + \draw ([shift={(\LLX,\LLY)}]0,-\DEPTH) rectangle ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT); + \draw (\LLX,-\DEPTH+\LLY) -- ([shift={(-\URX,0)}]\WIDTH,-\DEPTH+\LLY); + \draw [->] (\LLX+.2\WIDTH,-\DEPTH+\LLY) -- (\LLX+.2\WIDTH,0) node [right,midway] {\scriptsize moves down}; + \path [fill=white,draw] (\LLX,-\DEPTH+\LLY) circle (1pt); + \end{scope} + \begin{scope}[blue!50!black] %,every node/.append style={inner sep=2pt}] + \draw [->] (\LLX,0) -- (\LLX,\LLY-\DEPTH) node [right,midway] {\scriptsize lly}; + \draw [->] (0,-\DEPTH+\LLY) -- ++(\LLX,0) node [above,midway] {\scriptsize llx}; + \draw [->] + ([shift={(-\URX,0)}]\WIDTH,0) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [right,midway] {\scriptsize ury} + ; + \draw [->] + ([shift={(0,-\URY)}]0,\HEIGHT) -- + ([shift={(-\URX,-\URY)}]\WIDTH,\HEIGHT) + node [above,midway] {\scriptsize urx} + ; + \end{scope} +% Box + \draw [thick] (0,-\DEPTH) rectangle (\WIDTH,\HEIGHT); +% Origin + \path [fill=white,draw=black] (0,0) circle (1pt); +% Center inner box + \path let + \p1 = (current bounding box.south west), + \p2 = (current bounding box.north east), + \p3 = (0,-\DEPTH), + \p4 = (\WIDTH,\HEIGHT) + in + (\x3-\x2+\x4,\y3) rectangle (\x4+\x3-\x1,\y4); +\end{tikzpicture} +%<*standalone> +\end{document} +%</standalone> +% \iffalse +%</viewport.tex> +% \fi +% diff --git a/macros/latex/contrib/adjustbox/trimclip.pdf b/macros/latex/contrib/adjustbox/trimclip.pdf Binary files differnew file mode 100644 index 0000000000..2ad59ec6b4 --- /dev/null +++ b/macros/latex/contrib/adjustbox/trimclip.pdf |