diff options
author | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
commit | 6f9e1680085e7bb4d258f6f8116369d122e196e1 (patch) | |
tree | 9ac0ecb239240d1d672b188f29c1479de215074b /graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex | |
parent | b8345f39630408bb198e7636381ce4240154ca9b (diff) |
CTAN sync 202301160303
Diffstat (limited to 'graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex')
-rw-r--r-- | graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex | 458 |
1 files changed, 458 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex b/graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex new file mode 100644 index 0000000000..00de962abe --- /dev/null +++ b/graphics/pgf/base/tex/generic/libraries/pgflibrarypatterns.meta.code.tex @@ -0,0 +1,458 @@ +% Copyright 2019 by Mark Wibrow +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Public License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + +\def\pgf@pat@type@uncolored{0}% +\def\pgf@pat@type@colored{1}% +\newif\ifpgf@pat@makepatternimmutable + +\pgfkeys{/pgf/patterns/.cd, + name/.store in=\pgf@pat@name, + number ../.store in=\pgf@pat@number, + type/.is choice, + type/uncolored/.code={\let\pgf@pat@type=\pgf@pat@type@uncolored}, + type/colored/.code={\let\pgf@pat@type=\pgf@pat@type@colored}, + type/form only/.style={/pgf/patterns/type=uncolored}, + type/inherently colored/.style={/pgf/patterns/type=colored}, + x/.store in=\pgf@pat@xvec, + y/.store in=\pgf@pat@yvec, + parameters/.store in=\pgf@pat@parameters, + defaults/.store in=\pgf@pat@defaults, + append to defaults/.code={% + \pgf@pat@addto@macro\pgf@pat@defaults{,#1}% + }, + bottom left/.store in=\pgf@pat@bottomleft, + top right/.store in=\pgf@pat@topright, + tile size/.store in=\pgf@pat@tilesize, + tile transformation/.store in=\pgf@pat@transformation, + code/.store in=\pgf@pat@code, + set up code/.store in=\pgf@pat@declarebefore, + % + name=, + number ..=, + type=uncolored, + x=1cm, y=1cm, + parameters=, + defaults=, + bottom left=, + top right=, + tile size=, + tile transformation=, + code=, + set up code=, +}% + +\def\pgf@pat@name@prefix{pgf@pattern@name@meta@}% + +\def\pgfifpatternundefined#1{% + \pgfutil@ifundefined{\pgf@pat@name@prefix#1}% +}% + +\def\pgf@pat@adddef@to@macro#1#2{% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{\expandafter#1\expandafter% + \def\expandafter#2\expandafter{#2}}% +}% + +\def\pgf@pat@addto@macro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}}% + +\def\pgf@pat@process#1{% + \pgf@process{#1}% +}% + +\def\pgf@pat@doifnotempty#1{% + \ifx#1\pgfutil@empty% + \let\pgf@pat@next=\relax% + \else% + \let\pgf@pat@next=#1% + \fi% + \pgf@pat@next% +}% + +\def\pgf@pat@processtransformations#1{#1}% +\def\pgf@pat@processpoint#1{% + \pgf@process{#1}% +}% + + +\def\pgfdeclarepattern#1{% + \begingroup% + \nullfont% + \def\pgf@pat@options{,#1}% + \pgfkeys{/pgf/patterns/.cd,#1}% + \ifx\pgf@pat@name\pgfutil@empty + \pgferror{Declaring unnamed pattern}% + \fi + \ifx\pgf@pat@bottomleft\pgfutil@empty + \pgferror{Bottom left corner of the bounding box unset}% + \fi + \ifx\pgf@pat@topright\pgfutil@empty + \pgferror{Top right corner of the bounding box unset}% + \fi + \ifx\pgf@pat@tilesize\pgfutil@empty + \pgferror{Tile size unset}% + \fi + \ifx\pgf@pat@code\pgfutil@empty + \pgferror{Pattern code is empty}% + \fi + \pgf@declarepattern@meta% + \endgroup% +}% +\def\pgf@declarepattern@meta{% + \pgfifpatternundefined{\pgf@pat@name}{% + \ifx\pgf@pat@parameters\pgfutil@empty% + % No parameters, so pattern is declared now. + \pgf@pat@declare% + \edef\pgf@marshal{% + \noexpand\pgf@pat@addto@macro\noexpand\pgf@pat@options{,number ..=\pgf@pattern@number}}% + \pgf@marshal% + \fi% + % It is a bit inefficient that all the options for + % immutable patterns are saved when only the type + % and number are needed. + \expandafter\global\expandafter\let\csname\pgf@pat@name@prefix\pgf@pat@name\endcsname=\pgf@pat@options% + }{% + \pgferror{Pattern `\pgf@pat@name' already defined}% + }% +}% +\let\pgf@pat@declarebefore=\pgfutil@empty +\let\pgf@pat@declareafter=\pgfutil@empty +\let\pgf@pat@codebefore=\pgfutil@empty +\let\pgf@pat@codeafter=\pgfutil@empty + +\def\pgf@pat@declare{% + \pgfsysprotocol@getcurrentprotocol\pgf@pattern@temp% + {% + % Set up x and y vectors. Should use a scope rather than TeX group? + % Vectors may be needed when the tile bounding box is + % calculated. + \pgfsetxvec{\pgfpoint{\pgf@pat@xvec}{+0pt}}% + \pgfsetyvec{\pgfpoint{+0pt}{\pgf@pat@yvec}}% + \pgf@pat@doifnotempty\pgf@pat@declarebefore% + \pgfinterruptpath% + \pgfpicturetrue% + \pgf@relevantforpicturesizetrue% + \pgftransformreset% + \pgfsysprotocol@setcurrentprotocol\pgfutil@empty% + \pgfsysprotocol@bufferedtrue% + \pgfsys@beginscope% + \pgfinterruptboundingbox% + \pgfsetarrows{-}% + \pgf@pat@doifnotempty\pgf@pat@codebefore + \pgf@pat@code% + \pgf@pat@doifnotempty\pgf@pat@codeafter% + \endpgfinterruptboundingbox% + \pgfsys@endscope% + \pgfsysprotocol@getcurrentprotocol\pgf@pattern@code% + \global\let\pgf@pattern@code=\pgf@pattern@code% + \endpgfinterruptpath% + \pgf@pat@doifnotempty\pgf@pat@declareafter% + \pgf@pat@processpoint{\pgf@pat@bottomleft}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \pgf@pat@processpoint{\pgf@pat@topright}% + \pgf@xb=\pgf@x% + \pgf@yb=\pgf@y% + \pgf@pat@processpoint{\pgf@pat@tilesize}% + \pgf@xc=\pgf@x% + \pgf@yc=\pgf@y% + \begingroup% + \pgftransformreset% + \pgf@pat@processtransformations\pgf@pat@transformation% + \pgfgettransformentries\aa\ab\ba\bb\shiftx\shifty% + \global\edef\pgf@pattern@matrix{{\aa}{\ab}{\ba}{\bb}{\shiftx}{\shifty}}% + \endgroup% + % Now, build a name for the pattern + \pgfutil@tempcnta=\pgf@pattern@number\relax% + \advance\pgfutil@tempcnta by1\relax% + \xdef\pgf@pattern@number{\the\pgfutil@tempcnta}% + \xdef\pgf@marshal{\noexpand\pgfsys@declarepattern% + {\pgf@pattern@number}% + {\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}{\the\pgf@xc}{\the\pgf@yc}\pgf@pattern@matrix{\pgf@pattern@code}{\pgf@pat@type}}% + }% + \pgf@marshal% + \pgfsysprotocol@setcurrentprotocol\pgf@pattern@temp% +}% + +\def\pgf@pat@checkname#1{% + \pgf@pat@@checkname#1[]\pgf@patstop}% + +\def\pgf@pat@@checkname#1[#2]#3\pgf@patstop{% + \expandafter\def\expandafter\pgf@pat@onlinename\expandafter{\romannumeral-`0\pgfutil@trimspaces{#1}}% + \def\pgf@pat@onlineoptions{#2}% +}% + + +\def\pgf@pat@unravel#1/{% + \pgfutil@ifnextchar\pgf@stop{\def\pgf@pat@unravelled{#1}}{\pgf@pat@unravel}}% + +\pgfkeys{/handlers/.pattern/.code={% + \expandafter\expandafter\expandafter\pgf@pat@unravel\pgfkeyscurrentpath/\pgf@stop% + \pgfpatternalias{#1}{\pgf@pat@unravelled}% +}}% + +\def\pgfpatternalias#1#2{% + \begingroup% + \pgf@pat@checkname{#1}% + \expandafter\let\expandafter\pgf@pat@options\expandafter=% + \csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname% + \pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}% + \pgfutil@toks@\expandafter{\pgf@pat@onlineoptions}% + \edef\pgf@pat@tmp{append to defaults={\the\pgfutil@toks@}}% + \expandafter\pgf@pat@addto@macro\expandafter\pgf@pat@options\expandafter{\expandafter,\pgf@pat@tmp}% + \pgf@pat@addto@macro\pgf@pat@options{,name=#2}% + \expandafter\global\expandafter\let\csname\pgf@pat@name@prefix#2\endcsname=\pgf@pat@options% + \endgroup% +}% + + +\let\pgfsetfillpattern@old=\pgfsetfillpattern + +\def\pgf@pat@macroaskeys#1#2{% + \pgfutil@toks@\expandafter{#2}% + \edef\pgf@marshal{\noexpand\pgfkeys{,#1,\the\pgfutil@toks@}}% + \pgf@marshal% +}% +\def\pgfsetfillpattern#1#2{% + \pgf@pat@checkname{#1}% + \pgfutil@ifundefined{\pgf@pat@name@prefix\pgf@pat@onlinename}{% + \pgfsetfillpattern@old{\pgf@pat@onlinename}{#2}% + }{% + \let\pgf@pat@parameters=\pgfutil@empty% + % Get pattern parameters, type, and number + \expandafter\let\expandafter\pgf@pat@options\expandafter=% + \csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname% + \pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}% + \ifx\pgf@pat@parameters\pgfutil@empty% + % Immutable pattern. Do nothing. + \else% + % Mutable. Do a *lot*. + \begingroup% + \pgf@pat@macroaskeys{/pgf/pattern keys/.cd}{\pgf@pat@defaults}% + \pgf@pat@macroaskeys{/pgf/pattern keys/.cd}{\pgf@pat@onlineoptions}% + % ...to get the values of the current parameters... + \edef\pgf@pat@current@parameters{\pgf@pat@parameters}% + % ...and the internal pattern name. + \edef\pgf@pat@onlinename{\pgf@pat@onlinename\pgf@pat@current@parameters}% + \let\pgf@pat@name=\pgf@pat@onlinename% + \pgfutil@ifundefined{\pgf@pat@name@prefix\pgf@pat@onlinename}{% + %\ifpgf@pat@makepatternimmutable% + \let\pgf@pat@parameters=\pgfutil@empty% + %\fi% + \pgf@declarepattern@meta% + }{}% + \expandafter% + \endgroup% + \expandafter\def\expandafter\pgf@pat@onlinename\expandafter{\pgf@pat@onlinename}% + \expandafter\let\expandafter\pgf@pat@options\expandafter=% + \csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname% + \pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}% + \fi% + \ifx\pgf@pat@type\pgf@pat@type@uncolored% + \pgf@pat@setpatternuncolored{\pgf@pat@number}{#2}% + \else% + \pgfsys@setpatterncolored{\pgf@pat@number}% + \fi% + }% +}% + +\def\pgf@pat@setpatternuncolored#1#2{% + \pgfutil@colorlet{pgf@tempcolor}{#2}% + \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@tempcolor}}% + \pgfutil@extractcolorspec{pgf@tempcolor}{\pgf@tempcolor}% + \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}% + \expandafter\pgf@pat@set@fill@patternuncolored\pgf@rgbcolor\relax{#1}% +}% +\def\pgf@pat@set@fill@patternuncolored#1,#2,#3\relax#4{% + \pgfsys@setpatternuncolored{#4}{#1}{#2}{#3}% +}% + +% Predefined patterns + +\pgfdeclarepattern{ + name=Lines, + parameters={ + \pgfkeysvalueof{/pgf/pattern keys/distance}, + \pgfkeysvalueof{/pgf/pattern keys/angle}, + \pgfkeysvalueof{/pgf/pattern keys/xshift}, + \pgfkeysvalueof{/pgf/pattern keys/yshift}, + \pgfkeysvalueof{/pgf/pattern keys/line width}, + }, + bottom left={% + \pgfpoint + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + top right={% + \pgfpoint + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + tile size={% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/distance}}% + {\pgfkeysvalueof{/pgf/pattern keys/distance}}}, + tile transformation={% + \pgftransformshift{% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/xshift}}% + {\pgfkeysvalueof{/pgf/pattern keys/yshift}}}% + \pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}}, + defaults={ + distance/.initial=3pt, + angle/.initial=0, + xshift/.initial=0pt, + yshift/.initial=0pt, + line width/.initial=\the\pgflinewidth, + }, + code={% + \pgfsetlinewidth{\pgfkeysvalueof{/pgf/pattern keys/line width}}% + \pgfpathmoveto{\pgfpoint{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}% + \pgfpathlineto{\pgfpoint{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}% + \pgfusepath{stroke}% + }, +} + +\pgfdeclarepattern{ + name=Hatch, + parameters={ + \pgfkeysvalueof{/pgf/pattern keys/distance}, + \pgfkeysvalueof{/pgf/pattern keys/angle}, + \pgfkeysvalueof{/pgf/pattern keys/xshift}, + \pgfkeysvalueof{/pgf/pattern keys/yshift}, + \pgfkeysvalueof{/pgf/pattern keys/line width}, + }, + bottom left={% + \pgfpoint + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + top right={% + \pgfpoint + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + tile size={% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/distance}}% + {\pgfkeysvalueof{/pgf/pattern keys/distance}}}, + tile transformation={% + \pgftransformshift{% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/xshift}}% + {\pgfkeysvalueof{/pgf/pattern keys/yshift}}}% + \pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}}, + defaults={ + distance/.initial=3pt, + angle/.initial=0, + xshift/.initial=0pt, + yshift/.initial=0pt, + line width/.initial=\the\pgflinewidth, + }, + code={% + \pgfsetlinewidth{\pgfkeysvalueof{/pgf/pattern keys/line width}}% + \pgfpathmoveto{\pgfpoint{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}% + \pgfpathlineto{\pgfpoint{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}% + \pgfpathmoveto{\pgfpoint{0pt}{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}% + \pgfpathlineto{\pgfpoint{0pt}{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}% + \pgfusepath{stroke}% + }, +} + +\pgfdeclarepattern{ + name=Dots, + parameters={ + \pgfkeysvalueof{/pgf/pattern keys/distance}, + \pgfkeysvalueof{/pgf/pattern keys/angle}, + \pgfkeysvalueof{/pgf/pattern keys/xshift}, + \pgfkeysvalueof{/pgf/pattern keys/yshift}, + \pgfkeysvalueof{/pgf/pattern keys/radius}, + }, + bottom left={% + \pgfpoint + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + top right={% + \pgfpoint + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + tile size={% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/distance}}% + {\pgfkeysvalueof{/pgf/pattern keys/distance}}}, + tile transformation={% + \pgftransformshift{% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/xshift}}% + {\pgfkeysvalueof{/pgf/pattern keys/yshift}}}% + \pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}}, + defaults={ + distance/.initial=3pt, + angle/.initial=0, + xshift/.initial=0pt, + yshift/.initial=0pt, + radius/.initial=.5pt, + }, + code={% + \pgfpathcircle% + {\pgfpointorigin}% + {\pgfkeysvalueof{/pgf/pattern keys/radius}} + \pgfusepath{fill}% + }, +} + +\pgfdeclarepattern{ + name=Stars, + parameters={ + \pgfkeysvalueof{/pgf/pattern keys/distance}, + \pgfkeysvalueof{/pgf/pattern keys/angle}, + \pgfkeysvalueof{/pgf/pattern keys/xshift}, + \pgfkeysvalueof{/pgf/pattern keys/yshift}, + \pgfkeysvalueof{/pgf/pattern keys/radius}, + \pgfkeysvalueof{/pgf/pattern keys/points}, + }, + bottom left={% + \pgfpoint + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + top right={% + \pgfpoint + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}% + {.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}, + tile size={% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/distance}}% + {\pgfkeysvalueof{/pgf/pattern keys/distance}}}, + tile transformation={% + \pgftransformshift{% + \pgfpoint + {\pgfkeysvalueof{/pgf/pattern keys/xshift}}% + {\pgfkeysvalueof{/pgf/pattern keys/yshift}}}% + \pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}}, + defaults={ + distance/.initial=3mm, + angle/.initial=0, + xshift/.initial=0pt, + yshift/.initial=0pt, + radius/.initial=1mm, + points/.initial=5, + }, + code={% + \pgfmathsetmacro\a{180/(\pgfkeysvalueof{/pgf/pattern keys/points})}% + \pgfpathmoveto{\pgfpointpolar{90}{\pgfkeysvalueof{/pgf/pattern keys/radius}}}% + \foreach \i in {1,...,\pgfkeysvalueof{/pgf/pattern keys/points}}{% + \pgfpathlineto{\pgfpointpolar{90+2*\i*\a-\a}{.5*(\pgfkeysvalueof{/pgf/pattern keys/radius})}}% + \pgfpathlineto{\pgfpointpolar{90+2*\i*\a}{\pgfkeysvalueof{/pgf/pattern keys/radius}}}% + }% + \pgfpathclose% + \pgfusepath{fill}% + }, +} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: |