summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-lsystem/pst-lsystem.tex
blob: bc76fbed9169c18a0506ffd2e1273be7116ab6f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
%%
%% This is file `pst-lsystem.tex',
%%
%% IMPORTANT NOTICE:
%%
%% Package `pst-lsystem.tex'
%%
%% Herbert Voss <herbert -> dante.de>
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory macros/latex/base/lppl.txt.
%%
%% DESCRIPTION:
%%   `pst-lsystem' is a PSTricks package for lsystem macros
%%
%%
\csname PSTlsystemLoaded\endcsname
\let\PSTlsystemLoaded\endinput
% Requires PSTricks
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey.tex \fi
%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
% interface to the `xkeyval' package
\pst@addfams{pst-lsystem}

\def\fileversion{0.01}
\def\filedate{2018/09/22}
\message{`PST-lsystem' v\fileversion, \filedate\space (hv)}
%
\pstheader{pst-lsystem.pro}
%
\def\pst@lsystem@checkRule#1#2{%
  \def\pst@tempg{}%
  \pst@cntm=0
  \ifx\relax#2\relax\else\pst@lsystem@@checkRule#2;\fi
  \expandafter\let\csname#1\endcsname\pst@tempg
  \global\expandafter\edef\csname#1number\endcsname{\the\pst@cntm}%
}
\def\pst@lsystem@@checkRule#1#2;{%[A
  \ifx#1[ \edef\pst@tempg{\pst@tempg\space B}%
  \else 
    \ifx#1] \edef\pst@tempg{\pst@tempg\space E}%
    \else 
      \edef\pst@tempg{\pst@tempg\space #1}%
      \ifcat A#1\global\advance\pst@cntm by 1\fi
    \fi
  \fi
  \ifx\relax#2\relax \else\pst@lsystem@@checkRule#2;\fi
}
%
\define@key[psset]{pst-lsystem}{F}[]{\pst@lsystem@checkRule{psk@lsystem@F}{#1}}
\define@key[psset]{pst-lsystem}{X}[]{\pst@lsystem@checkRule{psk@lsystem@X}{#1}}
\define@key[psset]{pst-lsystem}{Y}[]{\pst@lsystem@checkRule{psk@lsystem@Y}{#1}}
\define@key[psset]{pst-lsystem}{Start}[]{\pst@lsystem@checkRule{psk@lsystem@Start}{#1}}
\define@key[psset]{pst-lsystem}{Angle}[0]{\def\psk@lsystem@Angle{#1 }}
\define@key[psset]{pst-lsystem}{N}[5]{\def\psk@lsystem@N{#1 }}
\define@key[psset]{pst-lsystem}{Ftype}[4]{\def\psk@lsystem@Ftype{#1 }}
\define@key[psset]{pst-lsystem}{N2}[4]{\def\psk@lsystem@Nii{#1 }}
\define@key[psset]{pst-lsystem}{BaseLength}[1mm]{\pst@getlength{#1}\psk@lsystem@BaseLength}
\psset[pst-lsystem]{F={},X={},Y={},Start={},Angle=0,N=5,Ftype=4,BaseLength=1mm}
%
\define@key[psset]{pst-lsystem}{usecolor}[0]{\def\psk@lsystem@color{#1}}
%
\define@key[psset]{pst-lsystem}{order}[5]{\pst@getint{#1}\psk@lsystem@order}
%\define@key[psset]{pst-lsystem}{factor}[2]{\pst@checknum{#1}\psk@lsystem@factor}
% Size (the smaller, the bigger), no need to be changed, normally
%\define@key[psset]{pst-lsystem}{size}[4]{\pst@getint{#1}\psk@lsystem@size}
%\define@key[psset]{pst-lsystem}{type}[0]{\pst@getint{#1}\psk@lsystem@type}
\psset[pst-lsystem]{order=5,%factor=2,size=4,type=0,
  usecolor=0}
%
\def\pslsystem{\def\pst@par{}\pst@object{pslsystem}}
\def\pslsystem@i{\@ifnextchar(\pslsystem@ii{\pslsystem@ii(0,0)}}%
\def\pslsystem@ii(#1){%  #1: origin of starting point 
  \begin@SpecialObj
  \pst@getcolor{\pslinecolor}\psk@linecolor
  \pst@getcoor{#1}\pst@tempA
  \addto@pscode{
    \pst@tempA\space  /yOrig ED /xOrig ED
    tx@lsystemDict begin 
    /order \psk@lsystem@order\space def
    /N \psk@lsystem@N def
    /Ftype \psk@lsystem@Ftype def
    /angle \psk@lsystem@Angle def
    /START {\psk@lsystem@Start } bind def
    /Element { \psk@lsystem@BaseLength } def
    \ifcase\psk@lsystem@Ftype
      /F { D } def 
    \or %1
      /F { 0 eq { D } if } def 
    \or %2
      /F { dup 0 eq { D } if } def 
    \or %3
      /F { pop D } def 
    \else %4
        /F { dup 0 eq { D }{ 1 sub \psk@lsystem@Fnumber {dup} repeat \psk@lsystem@F } ifelse pop } def
    \fi
    /X { dup 0 ne { 1 sub \psk@lsystem@Xnumber { dup } repeat \psk@lsystem@X } if pop } def
    /Y { dup 0 ne { 1 sub \psk@lsystem@Ynumber { dup } repeat \psk@lsystem@Y } if pop } def
    /START {\psk@lsystem@Start } def
    1 setlinejoin
    1 setlinecap
% define a color procedure.  Parameter is depth.  BW used if no color defined
    \ifcase\psk@lsystem@color
      /color { pop \pst@usecolor\psk@linecolor } def
    \or
      /color { % random branches
        pop 3 {rand 100 mod 100 div} repeat setrgbcolor
      } def 
    \or 
      /color { % random subtrees
        2 eq {3 {rand 100 mod 100 div} repeat setrgbcolor} if
      } def 
    \or
      /color { % lighter green towards leaves, linear
        order exch sub order 2 mul div 1 3 div exch .7 exch sethsbcolor
      } def
    \or
      /color { % lighter green towards leaves, exponential
        neg 1.5 exch exp 2 div 1 3 div exch .7 exch sethsbcolor
      } def
    \else
      /color { pop \pst@usecolor\psk@linecolor } def
    \fi
    xOrig yOrig moveto
    90 rotate
    N START
    end
    \pst@number\pslinewidth SLW
    \pst@usecolor\psk@linecolor
  }%
  \pst@stroke
  \end@SpecialObj}
%
%
\catcode`\@=\PstAtCode\relax
%
%% END: pst-lsystem.tex
\endinput
%