summaryrefslogtreecommitdiff
path: root/graphics/pstricks/contrib/pst-lsystem
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 /graphics/pstricks/contrib/pst-lsystem
Initial commit
Diffstat (limited to 'graphics/pstricks/contrib/pst-lsystem')
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/Changes11
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/README.md25
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib119
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdfbin0 -> 2936125 bytes
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex396
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro26
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty8
-rw-r--r--graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex140
8 files changed, 725 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-lsystem/Changes b/graphics/pstricks/contrib/pst-lsystem/Changes
new file mode 100644
index 0000000000..52e9359b1f
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/Changes
@@ -0,0 +1,11 @@
+..... pst-lsystem.tex
+0.02 2018-12-31 some code cleanup
+0.01 2018-09-23 first CTAN version
+
+
+..... pst-lsystem.sty
+0.01 2018-09-23 first CTAN version
+
+
+..... pst-lsystem.pro
+0.01 2018-09-23 first CTAN version
diff --git a/graphics/pstricks/contrib/pst-lsystem/README.md b/graphics/pstricks/contrib/pst-lsystem/README.md
new file mode 100644
index 0000000000..14c6160d4b
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/README.md
@@ -0,0 +1,25 @@
+# pst-lsystem: creating images defined by a L-system:
+A L-system or Lindenmayer system is a parallel rewriting system and a type of
+formal grammar. An L-system consists of an alphabet of symbols that can be used
+to make strings, a collection of production rules that expand each symbol into
+some larger string of symbols, an initial »axiom« string from which to begin construction,
+and a mechanism for translating the generated strings into geometric structures.
+
+Save the files pst-lsystem.sty|pro|tex in a directory, which is part of your
+local TeX tree. The pro file should go into $TEXMF/dvips/pstricks/
+Then do not forget to run texhash to update this tree.
+
+pst-lsystem needs pstricks, which should
+be part of your local TeX installation, otherwise get it from a
+CTAN server, http://mirror.ctan.org
+
+PSTricks is PostScript Tricks, the documentation cannot be run
+with pdftex, use the sequence latex->dvips->ps2pdf or
+pdflatex with package auto-pst-pdf or xelatex.
+
+%% 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.
+
+
+%% $Id: README.md 819 2018-09-26 06:40:48Z herbert $
diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib
new file mode 100644
index 0000000000..ba627e29bb
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib
@@ -0,0 +1,119 @@
+%% -*-bibtex-*-
+@STRING{tugboat = {TUGboat} }
+@STRING{beiprogramm = {{\TeX}-Beiprogramm} }
+@STRING{bretter = {Bretter, die die Welt bedeuten} }
+@STRING{dtk = {{D}ie {\TeX}nische {K}om{\"o}die} }
+@STRING{editorial = {Editorial} }
+@STRING{fremdebuehne = {Von fremden B{\"u}hnen} }
+@STRING{fundus = {Aus dem Fundus} }
+@STRING{hinterbuehne = {Hinter der B{\"u}hne} }
+@STRING{leserbrief = {Leserbrief(e)} }
+@STRING{magazin = {Magazin} }
+@STRING{rezension = {Rezensionen} }
+@STRING{schonimmer = {Was Sie schon immer {\"u}ber {\TeX} wissen wollten \dots} }
+@STRING{theaterkasse = {Von der Theaterkasse} }
+@STRING{theatertage = {{\TeX}-Theatertage} }
+
+
+@online{wikipedia,
+ author = {family={\WikipediA},family-i=W},
+ sortlabel = {Wikipedia},
+ sortname = {Wikipedia},
+ title = {L-system},
+ date = {2018-09-08},
+ urldate = {2018-09-22},
+ url = {https://en.wikipedia.org/wiki/L-system},
+}
+
+
+@Book{companion,
+ author = {Michel Goosens and Frank Mittelbach and Sebastian Rahtz and Denis Roegel and Herbert Voß},
+ title = {The {\LaTeX} {G}raphics {C}ompanion},
+ publisher = {{Addison-Wesley Publishing Company}},
+ edition = 2,
+ year = {2007},
+ address = {Reading, Mass. (USA)}
+}
+
+@Book{PSTricks2,
+ author = {Herbert Voß},
+ title = {\texttt{PSTricks} -- {G}rafik f\"ur \TeX{} und \LaTeX},
+ edition = {7},
+ publisher = {DANTE and Lehmanns Media},
+ year = {2017},
+ address = {Heidelberg and Berlin}
+}
+
+
+@Book{PSTricksE,
+ author = {Herbert Voß},
+ title = {\texttt{PSTricks} -- {G}raphics and {P}ost{S}cript for \LaTeX},
+ edition = {1},
+ publisher = {UIT},
+ date = {2011},
+ location = {Cambridge -- UK}
+}
+
+
+
+@Book{LaTeXRef,
+ author = {Herbert Voß},
+ title = {\LaTeX\ Referenz},
+ edition = {3},
+ publisher = {DANTE and Lehmanns Media},
+ year = {2012},
+ address = {Heidelberg and Berlin}
+}
+@Book{PostScript,
+ Author = {Kollock, Nikolai G.},
+ Title = {Post{S}cript richtig eingesetzt: vom {K}onzept zum
+ praktischen {E}insatz},
+ Publisher = {IWT},
+ Address = {Vaterstetten},
+ year = 1989,
+}
+
+@online{pstricks,
+ Title = {PSTricks - {\PS} macros for generic {\TeX}},
+ Author = {{Timothy van} Zandt},
+ url = {http://www.tug.org/application/PSTricks},
+ year = 1993
+}
+
+@online{charp,
+ author= {Michel Charpentier},
+ title = {Dragon Curve in PostScript},
+ url = {http://www.cs.unh.edu/~charpov/Programming/L-systems/simple-dragon.ps},
+ urldate={2018-09-24},
+}
+
+@online{charp2,
+ author= {Michel Charpentier},
+ title = {L-systems in PostScript},
+ url = {http://www.cs.unh.edu/~charpov/Programming/L-systems/plant2.ps},
+ urldate={2018-09-24},
+}
+
+@book{Linde,
+author={Przemyslaw Prusinkiewicz and Aristid Lindenmayer},
+title={The Algorithmic Beauty of Plants},
+publisher= {Springer-Verlag},
+date={1990},
+}
+
+@article{charp3,
+ author= {Michel Charpentier},
+ title={Programming L-Systems in PostScript},
+ journal = {Zpravodaj Československého sdružení uživatelů \TeX u},
+ organisation = {CSTUG: Czech and Slovak \TeX\ Users Group},
+ date = {2012},
+ doi={10.5300/2012-1/9},
+number = 1,
+pages={9--19},
+url={http://bulletin.cstug.cz/pdf/bul_0013.pdf},
+urldate = {2018-09-25},
+}
+
+
+
+
diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf
new file mode 100644
index 0000000000..ff9180091a
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex
new file mode 100644
index 0000000000..073ac3c699
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex
@@ -0,0 +1,396 @@
+%% $Id: pst-lsystem-doc.tex 820 2018-09-26 09:52:39Z herbert $
+\documentclass[fontsize=11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false,
+ headings=small, headinclude=false,footinclude=false,oneside,abstract=on]{pst-doc}
+\usepackage{pst-lsystem}
+\let\pstFV\fileversion
+\usepackage{dtk-logos}
+\usepackage{xltabular}
+\renewcommand\bgImage{%
+\begin{pspicture}(-2,-0.5)(3,6)
+\pslsystem[
+ Start=Y,
+ X={X[-FFF][+FFF]FX},
+ Y={YFX[+Y][-Y]},
+ Angle=25,
+ N=6,
+ Ftype=1,
+ BaseLength=2.5pt,
+ usecolor=2](0,0)
+\psdot(0,0)
+\end{pspicture}
+}
+
+\addbibresource{\jobname.bib}
+
+
+\lstset{language=PSTricks,
+ morekeywords={pslsystem},basicstyle=\footnotesize\ttfamily,
+ literate=%
+ {Ö}{{\"O}}1
+ {Ä}{{\"A}}1
+ {Ü}{{\"U}}1
+ {ß}{{\ss}}1
+ {ü}{{\"u}}1
+ {ä}{{\"a}}1
+ {ö}{{\"o}}1
+ {~}{{\textasciitilde}}1
+}
+\begin{document}
+
+\title{\texttt{pst-lsystem}}
+\subtitle{Creating images, based on the Lindenmayer-system; v.\pstFV}
+\author{Herbert Voß}
+\docauthor{}
+\date{\today}
+\maketitle
+
+\tableofcontents
+
+\begin{abstract}
+\noindent
+\LPack{pst-lsystem} loads by default the following packages: \LPack{pst-xkey}, and, of course \LPack{pstricks}.
+All should be already part of your local \TeX\ installation. If not, or in case
+of having older versions, go to \url{http://www.CTAN.org/} and load the newest version.
+
+
+
+\vfill\noindent
+Thanks to \\
+Michel Charpentier,
+and last but not least
+ \url{http://mathworld.wolfram.com}.
+
+\end{abstract}
+
+
+\clearpage
+
+
+\section{Introduction}
+A L-system or Lindenmayer system is a parallel rewriting system and a type of
+formal grammar. An L-system consists of an alphabet of symbols that can be used
+to make strings, a collection of production rules that expand each symbol into
+some larger string of symbols, an initial »axiom« string from which to begin construction,
+and a mechanism for translating the generated strings into geometric structures.
+L-systems were introduced and developed in 1968 by Aristid Lindenmayer,
+a Hungarian theoretical biologist and botanist at the University of Utrecht.~\cite{wikipedia}
+
+
+\section{Usage}
+There are no optional arguments for the package:
+\begin{verbatim}
+\usepackage{pst-lsystem}
+\end{verbatim}
+
+There is only one command:
+
+\begin{BDef}
+\Lcs{pslsystem}\OptArgs\Largr{x,y}
+\end{BDef}
+
+If the coordinates for the origin are missing, then $(0,0)$ is assumed. The L-System ist
+defined by the three functions $F$, $X$, and $Y$. At least one function must be given.
+
+\subsection{Optional arguments}
+
+The following optional arguments for the macro are possible:
+
+\begin{xltabular}{\linewidth}{@{} l l X @{}}\toprule
+\emph{name} & \emph{default} & \emph{menaing}\\\midrule
+\Lkeyword{F} & & Rule $F\rightarrow(F)$\\
+\Lkeyword{X} & & Rule $X\rightarrow(F,X,Y)$\\
+\Lkeyword{Y} & & Rule $Y\rightarrow(F,X,Y)$\\
+\Lkeyword{Start} & & Startrule $S\rightarrow(F,X,Y)$\\
+\Lkeyword{Angle} & 45 & Angle for the drection change\\
+\Lkeyword{N} & 5 & Number of the recursive calls\\
+\Lkeyword{Ftype} & 4 & How the F-rule should be handled\\
+\Lkeyword{BaseLength} & 1mm & The length of a base line, created by the ruke F (Forward)\\
+\Lkeyword{usecolor} & 0 & Which color should be used for the lines.\\
+%\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}
+\bottomrule
+\end{xltabular}
+
+\bigskip
+If the rules contain square brackets then it must be enclosed by braces:
+\verb|X=F[-X]| is wrong and \verb|X={F[-X]}| is correct.
+
+\subsection{Different types for the F-rule}
+
+It depends to the given rule(s) what kind of the F-type must be used.
+There are five possibilities:
+
+\begin{xltabular}{\linewidth}{@{} >{\ttfamily}l X @{}}
+0 & $F\rightarrow \textrm{draw line element}$ \\
+ & in PostScript: \verb|/F { D } def|\\
+1 & $F\rightarrow \textrm{If loop variable }=0 \textrm{ then draw line element}$\\
+ & in PostScript: \verb|/F { 0 eq { D } if } def|\\
+2 & $F\rightarrow \textrm{If loop variable }=0 \textrm{ then draw line element and keep variable}$\\
+ & in PostScript: \verb|/F { dup 0 eq { D } if } def|\\
+3 & $F\rightarrow \textrm{draw line element and delete current loop variable}$\\
+ & in PostScript: \verb|/F { pop D } def|\\
+4 & $F\rightarrow \textrm{If loop variable }=0 $ then draw line element! If not $=0$ decrease loop variable, duplicate it
+ $n-1$ times (n is the number of functions in $F$) and put F-rule on stack\\
+ & in PostScript: \verb|/F { dup 0 eq { D }{ 1 sub N 1 sub {dup} repeat F-rule } ifelse pop } def|
+\end{xltabular}
+
+\iffalse
+\begin{verbatim}
+\ifcase\psk@lsystem@Ftype
+ /F { D } def % type 0
+\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
+\end{verbatim}
+\fi
+
+The function D does nothing else than drawing a line in the current direction.
+Its length is given by the optional parameter BaseLength.
+
+\subsection{Color}
+There are four predefined color modes, where mode=0 is no color.
+
+
+\psset{linewidth=0.1pt}
+
+\section{Examples}
+\subsection{Dragon}
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-1.5)(4,6)
+\pslsystem[
+ X=-FX++FY-,
+ Y=+FX--FY+,
+ Ftype=1,
+ Start=X,
+ Angle=45,
+ N=9,
+ BaseLength=2mm](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Hilbert}
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-1,-0.5)(4,4)
+\pslsystem[
+ X=-YF+XFX+FY-,
+ Y=+XF-YFY-FX+,
+ Ftype=3,
+ Start=X,
+ Angle=90](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+
+
+\clearpage
+\subsection{Kochflake}
+
+If the rule for \Lkeyword{Start} has more than one function name, one has to repeat
+the number of iterations, which is \Lkeyword{N}, before every following function, but not
+for the first one. That is done already internally:
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-.5)(5,6)
+\pslsystem[
+ Start=F--NF--NF,% repeat number of iterations N
+ F=F+F--F+F,
+ Angle=60,
+ N=4,
+ BaseLength=2pt,
+ linecolor=red](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+
+
+\subsection{Plant 1}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-2.3)(4,6)
+\pslsystem[
+ Start=F,
+ F={FF-[-F+F+F]+[+F-F-F]},
+ Angle=22.5,
+ BaseLength=2pt,
+ usecolor=4](0,-2)
+\psdot(0,-2)
+\end{pspicture}
+\end{LTXexample}
+
+
+\clearpage
+
+\subsection{Plant 2}
+
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-3,-2.3)(2,6)
+\pslsystem[
+ Start=X,
+ X={F-[[X]+X]+F[+FX]-X},
+ F=FF,
+ Angle=22.5,
+ N=6,
+ BaseLength=1.25pt,
+ usecolor=3](0,-2)
+\psdot(0,-2)
+\end{pspicture}
+\end{LTXexample}
+
+
+
+\subsection{Plant 3}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-2.5)(2,5)
+\psset{xunit=3}
+\pslsystem[
+ Start=F,
+ F={F[+F]F[-F][F]},
+ Angle=20,
+ usecolor=3](0,-2)
+\psdot(0,-2)
+\end{pspicture}
+\end{LTXexample}
+
+\clearpage
+
+
+\clearpage
+
+\subsection{Plant 4}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-0.5)(3,6)
+\pslsystem[
+ Start=Y,
+ X={X[-FFF][+FFF]FX},
+ Y={YFX[+Y][-Y]},
+ Angle=25,
+ N=6,
+ Ftype=1,
+ BaseLength=2.5pt,
+ usecolor=2](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+
+
+\subsection{Plant 5}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-3,-.5)(3,9)
+\pslsystem[
+ Start=X,
+ X={F[+X][-X]FX},
+ F={FF},
+ Angle=25,
+ N=7,
+ BaseLength=1pt,
+ usecolor=2](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+\clearpage
+
+\clearpage
+
+\subsection{Plant 6}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-3,-.5)(3,9)
+\pslsystem[
+ Start=X,
+ X={F[+X]F[-X]+X},
+ F={FF},
+ Angle=20,
+ N=7,
+ BaseLength=1pt,
+ usecolor=2](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Plant 7}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-3,-.5)(3,9)
+\pslsystem[
+ Start=F,
+ F={F[+F]F[-F]F},
+ Angle=25,
+ BaseLength=1pt,
+ usecolor=2](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+\clearpage
+
+
+\subsection{Plant 8}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-4,-.5)(5,9)
+\pslsystem[
+ Start=F,
+ F={F[+F[+F][-F]F][-F[+F][-F]F]F[+F][-F]F},
+ Angle=30,
+ BaseLength=1pt,
+ usecolor=4](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Special case}
+
+\begin{LTXexample}[pos=r]
+\begin{pspicture}[showgrid=true](-2,-0.5)(1,4)
+\pslsystem[
+ Start=X,
+ F=FF,
+ X=F+X-F-X+F,
+ Angle=90,
+ N=6,
+ BaseLength=1pt](0,0)
+\psdot(0,0)
+\end{pspicture}
+\end{LTXexample}
+
+
+
+\clearpage
+\section{List of all optional arguments for \nxLPack{pst-lsystem}}
+
+\xkvview{family=pst-lsystem,columns={key,type,default}}
+
+
+\bgroup
+\raggedright
+\nocite{*}
+\printbibliography
+\egroup
+
+\printindex
+
+
+
+\end{document}
+
+
+
+% F=F+FF-FF-F-F+F+FF-F-F+F+FF+FF-F,
diff --git a/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro b/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro
new file mode 100644
index 0000000000..b4b047722e
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro
@@ -0,0 +1,26 @@
+%% pst-lsystem.pro (c) sep 22, 2018 Herbert Voss
+%% version 0.01 2018/09/22
+%
+% based on the work of Michel Charpentier
+%
+/tx@lsystemDict 6 dict def
+tx@lsystemDict begin
+
+/fast? true def % choice between faster or nicer
+
+/D { Element 0 rlineto } bind def
+
+/B [ % quite dirty, but it works...
+ fast? { {currentpoint stroke moveto} aload pop } if
+ {gsave} aload pop
+ { dup color } aload pop
+] cvx bind def
+
+%/B { currentpoint stroke moveto gsave } bind def
+/E { stroke grestore } bind def
+/- { angle neg rotate } def % rotation to the right
+/+ { angle rotate } def % rotation to the left
+%
+
+end
+
diff --git a/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty b/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty
new file mode 100644
index 0000000000..bf8a6f1e96
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty
@@ -0,0 +1,8 @@
+\RequirePackage{pstricks}
+\ProvidesPackage{pst-lsystem}[2009/11/07 package wrapper for
+ pst-lsystem.tex (hv)]
+\input{pst-lsystem.tex}
+\ProvidesFile{pst-lsystem.tex}
+ [\filedate\space v\fileversion\space `PST-lsystem' (hv)]
+\IfFileExists{pst-psm.pro}{\@addtofilelist{pst-lsystem.pro}}{}%
+\endinput
diff --git a/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex b/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex
new file mode 100644
index 0000000000..68e19e086c
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex
@@ -0,0 +1,140 @@
+%%
+%% 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.02}
+\def\filedate{2018/12/31}
+\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
+% \let#1\pst@tempg
+% \@namedef{\expandafter\@gobble\detokenize\expandafter{\string#1number}}{\the\pst@cntm}%
+ \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}[45]{\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=45,N=5,Ftype=4,BaseLength=1mm}
+%
+\define@key[psset]{pst-lsystem}{usecolor}[0]{\def\psk@lsystem@color{#1}}% 0 is no color
+%
+\define@key[psset]{pst-lsystem}{order}[5]{\pst@getint{#1}\psk@lsystem@order}
+\psset[pst-lsystem]{order=5,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
+%
+