summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/storebox
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/storebox
Initial commit
Diffstat (limited to 'macros/latex/contrib/storebox')
-rw-r--r--macros/latex/contrib/storebox/README13
-rw-r--r--macros/latex/contrib/storebox/storebox.dtx706
-rw-r--r--macros/latex/contrib/storebox/storebox.ins11
-rw-r--r--macros/latex/contrib/storebox/storebox.pdfbin0 -> 195300 bytes
4 files changed, 730 insertions, 0 deletions
diff --git a/macros/latex/contrib/storebox/README b/macros/latex/contrib/storebox/README
new file mode 100644
index 0000000000..a2470f2e30
--- /dev/null
+++ b/macros/latex/contrib/storebox/README
@@ -0,0 +1,13 @@
+LaTeX package 'storebox'
+~~~~~~~~~~~~~~~~~~~~~~~~
+Copyright (c) 2011 by Martin Scharrer <martin@scharrer.me>
+WWW: http://latex.scharrer.me/
+CTAN: http://www.ctan.org/pkg/storebox
+Code repository: https://bitbucket.org/martin_scharrer/storebox
+
+This package provides "store boxes" which have the same user interface like normal LaTeX "save boxes", but only
+store the content once in the output file even if it is used several times.
+At the moment only native PDF output is supported (i.e. pdflatex and lualatex).
+If the stored content is not used in the document after all it is not written to the PDF (at least the pdftex manual says so).
+For any other TeX and output format the package simply falls back to use the normal savebox equivalents.
+
diff --git a/macros/latex/contrib/storebox/storebox.dtx b/macros/latex/contrib/storebox/storebox.dtx
new file mode 100644
index 0000000000..cbc7d3b39c
--- /dev/null
+++ b/macros/latex/contrib/storebox/storebox.dtx
@@ -0,0 +1,706 @@
+% \iffalse meta-comment
+%<=*COPYRIGHT>
+%% Copyright (C) 2011 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 storebox.dtx and storebox.ins
+%% and the derived filebase storebox.sty and storebox-pgf.sty.
+%%
+%<=/COPYRIGHT>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{storebox.dtx}[%
+%<=*DATE>
+ 2011/12/21
+%<=/DATE>
+%<=*VERSION>
+ v1.3a
+%<=/VERSION>
+ DTX file for storebox]
+\documentclass{ydoc}
+\GetFileInfo{storebox.dtx}
+\usepackage{storebox}[\filedate]
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{\jobname.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{680}
+%
+% \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.99}{2011/08/05}{Converted to DTX file.}
+% \changes{v1.0}{2011/09/22}{First release.}
+% \changes{v1.1}{2011/10/21}{Fixed issue with \env{storebox} environment with new \pkg{collectbox} version.}
+% \changes{v1.2}{2011/12/19}{Added PDF resources argument to support transparent material.}
+% \changes{v1.3}{2011/12/20}{Added patch for PDF pdftex driver to fully support transparent material and shadings.}
+% \changes{v1.3a}{2011/12/21}{Made the use of \cs{immediate} optional so that unused storeboxes are not written to the PDF.}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+% \GetFileInfo{storebox.dtx}
+% \author{Martin Scharrer}
+% \email{martin@scharrer.me}
+% \ifdefined\repository
+% \repository{https://bitbucket.org/martin_scharrer/storebox}
+% \fi
+%
+% \maketitle
+%
+% \begin{abstract}\noindent
+% This package allows the placement of identical content multiple times in a document while only storing it once in the output file.
+% At the moment only \LaTeX\ compilers with native PDF output are supported (|pdflatex| or |lualatex|).
+% For other \LaTeX\ compilers a fallback to |\savebox| is implemented.
+% \end{abstract}
+%
+% \section{Introduction}
+% \LaTeX{} provides box registers to save content and use it later in the document once or multiple times (or none at all).
+% However, the box content is then written every time to the output file.
+% The PDF file format provides a way to store material as object and reference it later. A similar technique is theoretically
+% possible for PostScript output (but not yet implemented). This has the benefit that the content is really only stored once
+% in the output file. However, if file compression is used for the final output file the size benefit might be very small
+% if the content is only reused a low number of times.
+%
+% This package provides ``store boxes'' which have the same user interface like normal \LaTeX{} ``save boxes'', but only
+% store the content once in the output file even if it is used several times.
+% At the moment only PDF output is supported (i.e.\ \texttt{pdflatex} and \texttt{lualatex}).
+% If the stored content is not used in the document after all it is not written to the PDF except if the \opt{immediate} option was used.
+% For any other \TeX{} and output format the package simply falls back to use the normal savebox equivalents.
+%
+% \section{Known issues}
+% There are some known side effects with advanced graphic elements, namely transparencies and shadings.
+% These elements require special driver code which adds the required PDF instructions. For TikZ/PGF drawings this is done
+% by the |pdftex| driver of TikZ/PGF. However, due to a
+% \href{https://sourceforge.net/tracker/?func=detail&atid=752792&aid=3462542&group_id=142562}{bug in this driver}
+% transparent material is not supported, but shown fully opaque if the storebox also holds PDF shadings.
+% This affects \file{pgfsys-pdftex.def} in v1.26 from 2009/05/22 and earlier versions.
+% Since \pkg{storebox} v1.3 from 2011/12/20 a set of patches for the PGF |pdftex| driver is loaded (as support package \pkg{storebox-pgf}),
+% so that both transparencies and shadings are supported together. The patches are not loaded if a new version of the driver is detected.
+% Please report all issues with this patches to the \pkg{storebox} author, not to the TikZ/PGF authors.
+%
+% \section{Options}
+% The package allows to enable and disable the storebox feature. Normally this is selected automatically dependent if PDF output is used (using \pkg{ifpdf}).
+% It also provides two options \opt{enable} and \opt{disable} to explicitly switch the storebox feature on or off.
+% The \opt{disable} option is useful to see the resulting file size difference.
+% The usage of the \opt{enable} option should not be required and will lead to errors if used with unsupported \TeX{} formats.
+%
+% Two further complementary options \opt{delayed} (default) and \opt{immediate} are provided.
+% They control if a storebox (i.e.\ the underlying \Macro\pdfxform) is written to the PDF immediately or only after it gets referenced, i.e.\ is inserted into the document using
+% \Macro\usestorebox. With \opt{immediate} the storebox is always written into the PDF, even if it is not used. By default \opt{delayed} is used, but
+% it is possible that \opt{immediate} is required if \Macro\storebox is used inside other \Macro\pdfxform\relax's, e.g.\ inside certain TikZ/PGF nodes.
+% If any graphic issues occur in a document the \opt{immediate} option should first be tested before sending any bug reports.
+%
+% \Needspace*{3cm}
+% \section{Macros}
+%
+% \DescribeMacro{\newstorebox}{<\textbackslash boxname>}
+% Because storeboxes are stored as PDF objects and not as \TeX\ box registers
+% it is not required to allocate a register for them. However, in fall-back mode
+% the used control sequence \meta{\textbackslash boxname} must be defined as savebox.
+% This macro defines \meta{\textbackslash boxname} simply as \Macro\relax\relax (just as precaution) and is equal to
+% \Macro\newsavebox in fall-back mode.
+%
+%
+% \DescribeMacro{\storebox}{<\textbackslash boxname>}{<content>}
+% This stores the \meta{content} as \meta{\textbackslash boxname} (which is actually just a numeric reference) for later use.
+% The \pkg{collectbox} package is used to collect the \meta{content} as box and not as macro argument and therefore it can
+% contain verbatim and other special material. The braces can also be written in their explicit form \Macro\bgroup and \Macro\egroup
+% and then split in two different macros or across the begin and end of an environment.
+% It is possible to use \Macro\storebox multiple times with the same \meta{\textbackslash boxname}. This will create
+% a new PDF object without affected the old one.
+% In fall-back mode this macro is functional equal to \Macro\savebox\relax (but then still uses \pkg{collectbox}).
+%
+%
+% \DescribeEnv[<content>]{storebox}{<\textbackslash boxname>}
+% This is the environment version of \Macro\storebox. Special care is taken to allow for an identical name.
+% In fall-back mode this macro is equal to the \env{lrbox} environment.
+%
+%
+% \DescribeMacro{\usestorebox}{<\textbackslash boxname>}
+% This macro typesets the stored content at the current position (as horizontal box in horizontal mode).
+% This is realized by adding a PDF reference to the stored content.
+% In fall-back mode this macro is equal to \Macro\usebox.
+%
+%
+% \DescribeMacro{\ifstorebox}
+% This if-switch is set to \emph{true} if \Macro\storebox was successfully defined as intended
+% but to \emph{false} if the \Macro\savebox fall-back was used.
+%
+% \clearpage
+% \section{Example}
+% \begin{lstlisting}[gobble=2,language={[latex]tex},numbers=none]
+% \documentclass{article}
+%
+% \usepackage{storebox}
+%
+% \newstorebox{\mybox} % Not really required for PDF output
+% \begin{document}
+%
+% \storebox{\mybox}{\verb+Supports verbatim #$\empty+}
+%
+% \usestorebox{\mybox}
+% \usestorebox{\mybox}
+%
+% \storebox\mybox\bgroup
+% Can also be split
+% \verb+\empty+
+% \egroup
+%
+% \usestorebox{\mybox}
+% \usestorebox{\mybox}
+%
+% \begin{storebox}{\mybox}
+% Or used as environment
+% (then will ignore leading and trailing spaces)
+% \end{storebox}
+%
+% \usestorebox{\mybox}
+% \usestorebox{\mybox}
+%
+% \end{document}
+% \end{lstlisting}
+%
+% \setcounter{lstnumber}{1}
+% \StopEventually{}
+%
+% \clearpage
+% \section{Implementation}
+%
+% \iffalse
+%<*storebox.sty>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesPackage{storebox}[%
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Store and reuse boxes in a file size efficient way]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{disable}{\let\ifstorebox\iffalse}
+\DeclareOption{enable}{\let\ifstorebox\iftrue}
+\DeclareOption{immediate}{\let\storebox@immediate\immediate}
+\DeclareOption{delayed}{\let\storebox@immediate\relax}
+\ExecuteOptions{delayed}
+\ProcessOptions*
+\expandafter\ifx\csname ifstorebox\endcsname\relax
+ \RequirePackage{ifpdf}
+ \expandafter\let\csname ifstorebox\expandafter\endcsname\csname ifpdf\endcsname
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{collectbox}[2011/08/04]
+% \end{macrocode}
+%
+% \begin{macro}{\storebox}
+% \begin{macrocode}
+\newcommand*\storebox{%
+ \begingroup
+ \def\@tempa{storebox}%
+ \ifx\@currenvir\@tempa
+ \endgroup
+ \expandafter\@storebox@env
+ \else
+ \endgroup
+ \expandafter\@storebox
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\ifstorebox
+% \end{macrocode}
+%
+% \begin{macro}{\@storebox}
+% Macro version:
+% \begin{macrocode}
+\def\@storebox#1{%
+ \begingroup
+ \@collectboxto\collectedbox{%
+ \storebox@immediate\pdfxform resources {\the\pdfpageresources}\collectedbox
+ \endgroup\mathchardef#1=\pdflastxform
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@storebox@env}
+% Environment version. Code adapted from \env{lrbox} environment. The group added by \Macro\begin and \Macro\end must
+% be specially handled to allow for a local assignment.
+% \begin{macrocode}
+\def\@storebox@env#1{%
+ \edef\@tempa{%
+ \setbox\collectedbox\hbox\bgroup%
+ \def\noexpand\the@storebox{\noexpand#1}%
+ }%
+ \@tempa
+ \begingroup
+ \aftergroup\@storebox@env@end
+ \@endpefalse
+ \color@setgroup
+ \begingroup
+ \def\@currenvir{storebox\empty}%
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endstorebox}
+% \begin{macrocode}
+\def\endstorebox{%
+ \unskip
+ \endgroup
+ \color@endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@storebox@env@end}
+% This ends the box assignment and stores the box as PDF xform.
+% Then the given control sequence is set to the xform number.
+% \begin{macrocode}
+\def\@storebox@env@end{%
+ \edef\@tempa{%
+ \egroup
+ \immediate\pdfxform resources {\the\pdfpageresources}\collectedbox
+ \endgroup
+ \mathchardef\expandafter\noexpand\the@storebox=\pdflastxform
+ }%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\newstorebox}
+% \begin{macrocode}
+\newcommand*\newstorebox[1]{%
+ \@ifdefinable{#1}{\let#1\relax}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\usestorebox}
+% \begin{macrocode}
+\newcommand*\usestorebox[1]{%
+ \mbox{\pdfrefxform#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Load PGF driver patches if required:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{pgf}{\RequirePackage{storebox-pgf}{}}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+%
+%
+% \begin{macro}{\@storebox}
+% Macro version:
+% \begin{macrocode}
+\def\@storebox#1{\@collectboxto{#1}{}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@storebox@env}
+% \begin{macrocode}
+\def\@storebox@env{%
+ \edef\@currenvir{\@currenvir\noexpand\noexpand\noexpand\empty}%
+ \lrbox
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\endstorebox}
+% \begin{macrocode}
+\def\endstorebox{%
+ \endlrbox
+ \edef\@currenvir{\@currenvir}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newsavebox}
+% \begin{macrocode}
+\@ifdefinable\newstorebox{%
+\let\newstorebox\newsavebox
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\usestorebox}
+% \begin{macrocode}
+\@ifdefinable\usestorebox{%
+\let\usestorebox\usebox
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+
+% \iffalse
+%</storebox.sty>
+% \fi
+%
+%
+% \subsection{PGF patches}
+%
+% \iffalse
+%<*storebox-pgf.sty>
+% \fi
+% \begin{macrocode}
+%% This support package contains patches for the file 'pgfsys-pdftex.def' file from
+%% the TikZ/PGF bundle. All patches code is copyright by the TikZ/PGF authors
+%% and is used in this file according to the LPPL license.
+%% Please see the copyright and license notices in the 'pgfsys-pdftex.def' file.
+%%
+%% The rest of the code of this file is under the following copyright and licence:
+%%
+%<!COPYRIGHT>
+\ProvidesPackage{storebox-pgf}[%
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Patches for PGF to support transparency and shadings inside storeboxes]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\begingroup
+\let\on@line\@gobble
+%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@ifl@ter{def}{pgfsys-pdftex}{2009/05/23}{%
+ \PackageInfo{storebox-pgf}{Newer version of 'pgfsys-pdftex.def' found.\MessageBreak No patches applied.}%
+ \endgroup
+ \endinput
+}{}%
+% \end{macrocode}
+%
+% \begin{macro}{\storebox@patch}
+% \begin{macrocode}
+\def\storebox@patch#1#2#3#4{%
+ \ifx#1\@undefined
+ \PackageInfo{storebox-pgf}{Macro \string#1\space not defined.\MessageBreak No patch applied.}%
+ \else
+ \def\@tempa#2{#3}%
+ \ifx#1\@tempa
+ \PackageInfo{storebox-pgf}{Patching macro \string#1.}%
+ \gdef#1#2{#4}%
+ \else
+ \PackageInfo{storebox-pgf}{Macro \string#1\space with unknown definition.\MessageBreak No patch applied.}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\storebox@patch\pgfsys@horishading{#1#2#3}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \setbox\pgfutil@tempboxa=\hbox to\pgf@max{\vbox to\pgfmathresult pt{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \setbox\pgfutil@tempboxa=\hbox to\pgf@max{\vbox to\pgfmathresult pt{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\storebox@patch\pgfsys@vertshading{#1#2#3}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \setbox\pgfutil@tempboxa=\hbox to\pgfmathresult pt{\vbox to\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{\pgfpoint{#2}{\pgf@max}}%
+ \pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \setbox\pgfutil@tempboxa=\hbox to\pgfmathresult pt{\vbox to\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{\pgfpoint{#2}{\pgf@max}}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\storebox@patch\pgfsys@radialshading{#1#2#3}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \setbox\pgfutil@tempboxa=\hbox to2\pgf@max{\vbox to2\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
+ \advance\pgf@xa by \pgf@x%
+ \advance\pgf@ya by \pgf@y%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \pgf@sys@bp@correct{\pgf@xa}%
+ \pgf@sys@bp@correct{\pgf@ya}%
+ \pdfxform resources {%
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@sys@tonumber{\pgf@xa} \pgf@sys@tonumber{\pgf@ya} \pgf@doma\space \pgf@sys@tonumber{\pgf@x} \pgf@sys@tonumber{\pgf@y} \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [true false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}{%
+ {%
+ \pgf@parsefunc{#3}%
+ \setbox\pgfutil@tempboxa=\hbox to2\pgf@max{\vbox to2\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
+ \advance\pgf@xa by \pgf@x%
+ \advance\pgf@ya by \pgf@y%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \pgf@sys@bp@correct{\pgf@xa}%
+ \pgf@sys@bp@correct{\pgf@ya}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace /DeviceRGB
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@sys@tonumber{\pgf@xa} \pgf@sys@tonumber{\pgf@ya} \pgf@doma\space \pgf@sys@tonumber{\pgf@x} \pgf@sys@tonumber{\pgf@y} \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [true false] >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{\leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
+ }%
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\storebox@patch\pgfsys@functionalshading{#1#2#3#4}{%
+ {%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \setbox\pgfutil@tempboxa=\hbox to\pgf@x{\vbox to\pgf@y{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@sys@bp@correct{\pgf@xa}%
+ \pgf@sys@bp@correct{\pgf@ya}%
+ \pgf@sys@bp@correct{\pgf@xb}%
+ \pgf@sys@bp@correct{\pgf@yb}%
+ \pgf@xc=-\pgf@xa%
+ \pgf@yc=-\pgf@ya%
+ % Now build the function
+ \pdfobj
+ stream
+ attr
+ {
+ /FunctionType 4
+ /Domain [\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space\pgf@sys@tonumber{\pgf@ya}\space\pgf@sys@tonumber{\pgf@yb}]
+ /Range [0 1 0 1 0 1]
+ }
+ {{#4}}%
+ \edef\pgf@temp@num{\the\pdflastobj}%
+ \pdfxform resources {%
+ /Shading << /Sh << /ShadingType 1
+ /ColorSpace /DeviceRGB
+ /Matrix [1 0 0 1 \pgf@sys@tonumber{\pgf@xc}\space\pgf@sys@tonumber{\pgf@yc}]
+ /Domain [\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space\pgf@sys@tonumber{\pgf@ya}\space\pgf@sys@tonumber{\pgf@yb}]
+ /Function \pgf@temp@num\space 0 R
+ >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{%
+ \leavevmode%
+ \noexpand\pdfrefxform\the\pdflastxform%
+ \noexpand\pdfrefobj\pgf@temp@num%
+ }%
+ }%
+}{%
+ {%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \setbox\pgfutil@tempboxa=\hbox to\pgf@x{\vbox to\pgf@y{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
+ \pgf@sys@bp@correct{\pgf@xa}%
+ \pgf@sys@bp@correct{\pgf@ya}%
+ \pgf@sys@bp@correct{\pgf@xb}%
+ \pgf@sys@bp@correct{\pgf@yb}%
+ \pgf@xc=-\pgf@xa%
+ \pgf@yc=-\pgf@ya%
+ % Now build the function
+ \pdfobj
+ stream
+ attr
+ {
+ /FunctionType 4
+ /Domain [\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space\pgf@sys@tonumber{\pgf@ya}\space\pgf@sys@tonumber{\pgf@yb}]
+ /Range [0 1 0 1 0 1]
+ }
+ {{#4}}%
+ \edef\pgf@temp@num{\the\pdflastobj}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 1
+ /ColorSpace /DeviceRGB
+ /Matrix [1 0 0 1 \pgf@sys@tonumber{\pgf@xc}\space\pgf@sys@tonumber{\pgf@yc}]
+ /Domain [\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space\pgf@sys@tonumber{\pgf@ya}\space\pgf@sys@tonumber{\pgf@yb}]
+ /Function \pgf@temp@num\space 0 R
+ >> >>}\pgfutil@tempboxa% <<
+ \expandafter\xdef\csname @pgfshading#1!\endcsname{%
+ \leavevmode%
+ \noexpand\pdfrefxform\the\pdflastxform%
+ \noexpand\pdfrefobj\pgf@temp@num%
+ }%
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\storebox@patch\pgfsys@fadingfrombox{#1#2}{%
+ {%
+ \pgf@sys@pdf@check@resources%
+ \pgf@x=-.5\wd#2%
+ \pgf@y=-.5\ht#2%
+ \advance\pgf@y by.5\dp#2%
+ \expandafter\xdef\csname pgfsmasktrans@#1\endcsname{%
+ \noexpand\pgftransformcm{1}{0}{0}{1}{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \pdfxform resources { \pgf@sys@pdf@possible@resources } #2%
+ \expandafter\xdef\csname pgfsmaskxform@#1\endcsname{\the\pdflastxform}%
+ }%
+}{%
+ {%
+ \pgf@sys@pdf@check@resources%
+ \pgf@x=-.5\wd#2%
+ \pgf@y=-.5\ht#2%
+ \advance\pgf@y by.5\dp#2%
+ \expandafter\xdef\csname pgfsmasktrans@#1\endcsname{%
+ \noexpand\pgftransformcm{1}{0}{0}{1}{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \immediate\pdfxform resources { \pgf@sys@pdf@possible@resources } #2%
+ \expandafter\xdef\csname pgfsmaskxform@#1\endcsname{\the\pdflastxform}%
+ }%
+}
+\storebox@patch\pgfsys@transparencygroupfrombox{#1}{%
+ \pgf@sys@pdf@check@resources%
+ \pdfxform
+ attr { /Group << /S /Transparency >> } %<<
+ resources { \pgf@sys@pdf@possible@resources }
+ #1%
+ \setbox#1=\hbox{\pdfrefxform\pdflastxform}%
+}{%
+ \pgf@sys@pdf@check@resources%
+ \immediate\pdfxform
+ attr { /Group << /S /Transparency >> } %<<
+ resources { \pgf@sys@pdf@possible@resources }
+ #1%
+ \setbox#1=\hbox{\pdfrefxform\pdflastxform}%
+}
+\endgroup
+% \end{macrocode}
+%
+% \iffalse
+%</storebox-pgf.sty>
+% \fi
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/storebox/storebox.ins b/macros/latex/contrib/storebox/storebox.ins
new file mode 100644
index 0000000000..087a4c2172
--- /dev/null
+++ b/macros/latex/contrib/storebox/storebox.ins
@@ -0,0 +1,11 @@
+\input ydocstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\generate{%
+ \file{storebox.sty}{\nopreamble\from{storebox.dtx}{storebox.sty}}%
+ \file{storebox-pgf.sty}{\nopreamble\from{storebox.dtx}{storebox-pgf.sty}}%
+}
+\endbatchfile
+
+%% vim: ft=tex
diff --git a/macros/latex/contrib/storebox/storebox.pdf b/macros/latex/contrib/storebox/storebox.pdf
new file mode 100644
index 0000000000..26817275b9
--- /dev/null
+++ b/macros/latex/contrib/storebox/storebox.pdf
Binary files differ