summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/adjustbox/collectbox.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/adjustbox/collectbox.sty')
-rw-r--r--Master/texmf-dist/tex/latex/adjustbox/collectbox.sty591
1 files changed, 591 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/adjustbox/collectbox.sty b/Master/texmf-dist/tex/latex/adjustbox/collectbox.sty
new file mode 100644
index 00000000000..ba407935275
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/adjustbox/collectbox.sty
@@ -0,0 +1,591 @@
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{collectbox}[2011/08/23 v0.4 Collect macro arguments as boxes]
+% \end{macrocode}
+%
+% \begin{macro}{\collectedbox}
+% Box register used to store collected box.
+% \begin{macrocode}
+\newsavebox\collectedbox
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collectbox}
+% User level interface. Scans for potential star and optional arguments.
+% \begin{macrocode}
+\newcommand*\collectbox{%
+ \@ifstar
+ {\collectbox@a{{\BOXCONTENT}}}%
+ {\collectbox@a{}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@a}
+% \begin{macrocode}
+\long\def\collectbox@a#1{%
+ \@ifnextchar[%
+ {\collectbox@b{#1}}%
+ {\collectbox@b{#1}[]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@b}
+% \begin{macrocode}
+\long\def\collectbox@b#1[#2]#3{%
+ \@ifnextchar[%
+ {\collectbox@c{#2}{#3#1}}%
+ {\collectbox@c{#2}{#3#1}[]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@c}
+% \begin{macrocode}
+\long\def\collectbox@c#1#2[#3]{%
+ \collectbox@{#1}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collect@box}
+% The box primitive used. Might be locally redefined to \Macro\vbox if required.
+% \begin{macrocode}
+\let\collect@box\hbox
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collectbox@mode}
+%
+% \begin{macrocode}
+\let\collectbox@mode\leavevmode
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collectbox@}
+% The box is saved using |\setbox|. Color is supported by using |\collectbox@setgroup|.
+% A brace group is then opened using |\bgroup| which will replace the opening brace of the
+% ``argument''. The end code is installed in this group using |\aftergroup|.
+% The opening brace written by the user is then removed by assigning it as token to a dummy variable.
+% If no |{| or |\bgroup| follows the next token is taken as sole content.
+% \begin{macrocode}
+\newcommand\collectbox@[3]{%
+ \begingroup
+ \collectbox@mode
+ \@temptokena{#3\collectbox@end#2\endgroup}%
+ \setbox\collectedbox\collect@box\bgroup
+ \collectbox@setgroup
+ #1\bgroup
+ \aftergroup\the
+ \aftergroup\@temptokena
+ \collectbox@bgroup
+}
+\let\collectbox@macro\collectbox@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collectbox@env}
+% \begin{macrocode}
+\newcommand\collectbox@env[3]{%
+ \collectbox@mode
+ \def\collectboxenvend{#3\collectbox@end#2\collectbox@currenvir}%
+ \setbox\collectedbox\collect@box\bgroup
+ \collectbox@setgroup
+ \collectbox@reset
+ \ignorespaces
+ #1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@currenenvir}
+% \begin{macrocode}
+\def\collectbox@currenvir{%
+ \edef\@currenvir{\@currenvir}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@bgroup}
+% \begin{macrocode}
+\def\collectbox@macro@bgroup{%
+ \@ifnextchar\bgroup
+ {\let\@let@token=}%
+ {\collectbox@arg}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collectbox@env@bgroup}
+% \begin{macrocode}
+\def\collectbox@env@bgroup{%
+ \collectbox@reset
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\let\collectbox@bgroup\collectbox@macro@bgroup
+% \end{macrocode}
+%
+%
+% \begin{macro}{\collectbox@setgroup}
+% Used at the very begin of the stored box.
+% \begin{macrocode}
+\def\collectbox@setgroup{%
+ \color@setgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@endgroup}
+% Used at the very end of the stored box.
+% \begin{macrocode}
+\def\collectbox@endgroup{%
+ \collectbox@endcode
+ \color@endgroup
+}
+\let\collectbox@endcode\relax
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@collectbox}
+% Simpler and quicker version of \Macro\collectbox.
+% \begin{macrocode}
+\newcommand\@collectbox[1]{%
+ \begingroup
+ \collectbox@mode
+ \@temptokena{\collectbox@end#1\endgroup}%
+ \setbox\collectedbox\collect@box\bgroup
+ \collectbox@setgroup\bgroup
+ \aftergroup\the
+ \aftergroup\@temptokena
+ \collectbox@bgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@arg}
+% Supports |\collectbox{<code>}\somemacro| in addition to
+% |\collectbox{<code>}{\somemacro}|. The first following token is read and the inner brace group is closed
+% to trigger the |\aftergroup| code.
+% \begin{macrocode}
+\def\collectbox@arg#1{%
+ #1\egroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@end}
+% The color group is first closed, followed by the closing brace of the |\setbox| command.
+% The user dimension macros are then defined.
+% Direct after this code the users code is processed and concluded with a |\endgroup|.
+% \begin{macrocode}
+\def\collectbox@end{%
+ \collectbox@endgroup
+ \egroup
+ \collectbox@protecteddef\BOXCONTENT{\usebox\collectedbox}%
+ \collectbox@protecteddef\width{\wd\collectedbox}%
+ \collectbox@protecteddef\height{\ht\collectedbox}%
+ \collectbox@protecteddef\depth{\dp\collectedbox}%
+ \collectbox@protecteddef\totalheight{\@ovri}%
+ \totalheight\height
+ \advance\totalheight\depth
+ \ifcollectboxenv
+ \collectbox@reset
+ \collectbox@currenvir
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@reset}
+% \begin{macrocode}
+\def\collectbox@reset{%
+ \let\collectbox@endcode\relax
+ \let\collectbox@bgroup\collectbox@macro@bgroup
+ \let\collectbox@\collectbox@macro
+ \collectboxenvfalse
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@protecteddef}
+% \begin{macrocode}
+\begingroup
+\expandafter\ifx\csname protected\endcsname\relax
+ \let\collectbox@protecteddef\def%
+\else
+ \gdef\collectbox@protecteddef{\protected\def}%
+\fi
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@code}
+% Global storage macro for user code.
+% \begin{macrocode}
+\let\collectbox@code\empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxto}
+% User level interface. Reads box register and checks for optional argument.
+% \begin{macrocode}
+\newcommand\collectboxto[1]{%
+ \@ifnextchar[%
+ {\collectboxto@a{#1}}%
+ {\collectboxto@a{#1}[]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxto@a}
+% Reads first optional and next mandatory arguments.
+% \begin{macrocode}
+\long\def\collectboxto@a#1[#2]#3{%
+ \@ifnextchar[%
+ {\collectboxto@b{#1}{#2}{#3}}%
+ {\collectboxto@b{#1}{#2}{#3}[]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxto@b}
+% Reads second optional argument.
+% \begin{macrocode}
+\long\def\collectboxto@b#1#2#3[#4]{%
+ \collectboxto@{#1}{#2}{#3}{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxto@}[4]{box register}{code at begin}{code}{code at end}
+% Installs code and starts to collect the box.
+% \begin{macrocode}
+\newcommand\collectboxto@[4]{%
+ \collectbox@mode
+ \setbox#1\collect@box\bgroup
+ \def\collectbox@code{#4\collectbox@endgroup\egroup#3}%
+ \collectbox@setgroup#2\bgroup
+ \aftergroup\collectbox@code
+ \collectbox@bgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@collectboxto}
+% Collects the next brace group as hbox into box register |#1| and executes token |#2| afterwards.
+% \begin{macrocode}
+\newcommand\@collectboxto[2]{%
+ \collectbox@mode
+ \setbox#1\collect@box\bgroup
+ \def\collectbox@code{\collectbox@endgroup\egroup#2}%
+ \collectbox@setgroup\bgroup
+ \aftergroup\collectbox@code
+ \collectbox@bgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\nocollectbox@}[3]{<code at begin>}{<code>}{<code at end>}
+% Turns a brace group into \Macro\hbox{<code at begin><content><code at end>}<code>.
+% \begin{macrocode}
+\newcommand\nocollectbox@[3]{%
+ \collectbox@mode
+ \collect@box\bgroup
+ \def\collectbox@code{#3\egroup#2}%
+ #1\bgroup
+ \aftergroup\collectbox@code
+ \collectbox@bgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\nocollectbox@to}[4]{<length>}{<code at begin>}{<code>}{<code at end>}
+% Turns a brace group into \Macro\hbox' to '<length>{<code at begin><content><code at end>}<code>.
+% \begin{macrocode}
+\newcommand\nocollectbox@to[4]{%
+ \collectbox@mode
+ \collect@box to #1\bgroup
+ \def\collectbox@code{#4\egroup#3}%
+ #2\bgroup
+ \aftergroup\collectbox@code
+ \collectbox@bgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxcheckenv}
+% Checks if current macro is used as environment given by |#1|.
+% If so the |bgroup| eating macro is redefined.
+% A suitable end-macro is provided if non exists. All of this is done inside
+% a group to keep thing local.
+% The \Macro\@currenvir macro is redefined to contain \Macro\empty so that
+% macros with the same name can be used inside the environment without collisions.
+% This requires an extra internal group so that this change is reverted before the
+% \Macro\end macro.
+% \begin{macrocode}
+\newcommand*\collectboxcheckenv[1]{%
+ \begingroup
+ \def\@tempa{#1}%
+ \expandafter\endgroup
+ \ifx\@currenvir\@tempa
+ \@collectboxisenv{#1}%
+ \fi
+}
+\def\@collectboxisenv#1{%
+ \noindent
+ \collectboxenvtrue
+ \edef\@currenvir{\@currenvir\noexpand\empty}%
+ \let\collectbox@bgroup\collectbox@env@bgroup
+ \let\collectbox@endcode\collectbox@env@endcode
+ \let\collectbox@\collectbox@env
+ \expandafter\ifx\csname end#1\endcsname\relax
+ \expandafter\let\csname end#1\endcsname\collectbox@envend
+ \fi
+}
+\newif\ifcollectboxenv
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@env@endcode}
+% \begin{macrocode}
+\def\collectbox@env@endcode{\ifhmode\unskip\fi}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@envend}
+% \begin{macrocode}
+\def\collectbox@envend{\collectboxenvend}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxenvend}
+% \begin{macrocode}
+\def\collectboxenvend{%
+ \egroup
+ \collectbox@currenvir
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tabular collection}
+%
+% \begin{macro}{\collectboxtabular}
+% \begin{macrocode}
+\newcommand\collectboxtabular[3][c]{%
+ \collectbox@tab{tabular}{[#1]{#2}}{}{#3}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxtabularstar}
+% \begin{macrocode}
+\newcommand\collectboxtabularstar[4][c]{%
+ \collectbox@tab{tabular*}{[#1]{#2}{#3}}{}{#4}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectboxarray}
+% \begin{macrocode}
+\newcommand\collectboxarray[2]{%
+ \collectbox@tab{array}{{#1}}{\(}{#2}{\)}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@checkarray}
+% \begin{macrocode}
+\def\collectbox@checkarray{%
+\@ifpackageloaded{array}{%
+ \let\collectbox@realarraycr\@arraycr
+ \def\collectbox@setarraycr{%
+ \let\@arraycr\collebox@cr
+ \def\ialign{\let\@arraycr\collectbox@realarraycr \everycr {}\tabskip \z@skip \halign}%
+ }%
+}{%
+ \let\collectbox@realarraycr\@tabularcr
+ \def\collectbox@setarraycr{%
+ \let\@tabularcr\collebox@cr
+ \def\ialign{\let\noexpand\@tabularcr\noexpand\collectbox@realarraycr \everycr {}\tabskip \z@skip \halign}%
+ }%
+}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\collectbox@checkarray
+\AtBeginDocument{\collectbox@checkarray}%
+% \end{macrocode}
+%
+% \begin{macro}{\collectbox@dorealarraycr}
+% \begin{macrocode}
+\def\collectbox@dorealarraycr{%
+ \expandafter\collectbox@realarraycr\collectbox@aftercrstuff
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\let\collectbox@aftercrstuff\empty
+% \end{macrocode}
+%
+% \begin{macro}{\collectbox@tab}
+% \begin{macrocode}
+\def\collectbox@tab#1#2#3#4#5{%
+ \begingroup
+ \collectbox@mode
+ \def\collectbox@codeafter{#4\endgroup}%
+ \def\collectbox@endtabenv{\end{#1}#5\collectbox@end}%
+ \def\collectbox@dotab{#3\begin{#1}#2}%
+ \setbox\collectedbox\collect@box\bgroup
+ \collectbox@setgroup
+ \collectbox@setarraycr
+ \afterassignment\collectbox@dotab
+ \let\@let@token=%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collebox@cr}
+% \begin{macrocode}
+\def\collebox@cr{%
+ \@ifstar\collebox@@cr\collebox@@cr%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collebox@@cr}
+% \begin{macrocode}
+\def\collebox@@cr{%
+ \@ifnextchar[%
+ \collebox@@cr@opt
+ {\collebox@@@cr{}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collebox@@cr@opt}
+% \begin{macrocode}
+\def\collebox@@cr@opt[#1]{%
+ \collebox@@@cr{[#1]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collebox@@@cr}
+% \begin{macrocode}
+\def\collebox@@@cr#1{%
+ \def\collectbox@aftercrstuff{#1}%
+ \expandafter\collebox@@@@cr
+ \romannumeral-`0%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collebox@@@@cr}
+% \begin{macrocode}
+\def\collebox@@@@cr{%
+ \@ifnextchar\egroup{\collectbox@dorealarraycr\collectbox@aftertab}{%
+ \ifx\@let@token\noalign
+ \expandafter\collectbox@handlenoalign
+ \else
+ \expandafter\collectbox@dorealarraycr
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@handlenoalign}
+% \begin{macrocode}
+\def\collectbox@handlenoalign#1#2{%
+ \collectbox@dorealarraycr
+ \noalign{\bgroup\aftergroup\collectbox@afternoalign#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@handlenextnoalign}
+% \begin{macrocode}
+\def\collectbox@handlenextnoalign#1#2{%
+ \egroup
+ \noalign{\bgroup\aftergroup\collectbox@afternoalign#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@afternoalign}
+% \begin{macrocode}
+\def\collectbox@afternoalign{%
+ \expandafter\collectbox@@afternoalign
+ \romannumeral-`0%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@@afternoalign}
+% \begin{macrocode}
+\def\collectbox@@afternoalign{%
+ \@ifnextchar\egroup{\egroup\collectbox@aftertab}{%
+ \ifx\@let@token\noalign
+ \expandafter\collectbox@handlenextnoalign
+ \else
+ \expandafter\egroup
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\collectbox@aftertab}
+% \begin{macrocode}
+\def\collectbox@aftertab{%
+ \collectbox@endtabenv
+ \afterassignment\collectbox@codeafter
+ \let\@let@token=%
+}
+% \end{macrocode}
+% \end{macro}
+%